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

Artifact 99ad73c580aed9bc904894c804c9983c9f82b8426296f976f832ceb086babae1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%s/%d/%p: ",(S)
02c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28 50 29 2d 3e  ->zSelName,(P)->
02d0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 28 53 29 29  addrExplain,(S))
02e0: 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ,\.    sqlite3De
02f0: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0300: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43  e.# define SELEC
0310: 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a  TTRACE(K,P,S,X).
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
0330: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0350: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0360: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0370: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
0380: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
0390: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
03a0: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
03b0: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
03c0: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
03d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
03e0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
03f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
0400: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
0410: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
0420: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
0430: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
0440: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
0450: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0460: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
0470: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
0480: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
0490: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
04a0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
04b0: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
04c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
04d0: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
04e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
04f0: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
0500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
0510: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
0520: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
0530: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
0540: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0560: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0570: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0580: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52   about.** the OR
0590: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
05a0: 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71   BY) clause of q
05b0: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f  uery is being co
05c0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ded..**.** The a
05d0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
05e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72   used by the sor
05f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f  ter-references o
0600: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72  ptimization. For
0610: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
0620: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
0630: 6f 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  o index that can
0640: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0650: 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f   ORDER BY,.** fo
0660: 72 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  r the query:.**.
0670: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c  **     SELECT a,
0680: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
0690: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
06a0: 54 20 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d  T 10;.**.** it m
06b0: 61 79 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  ay be more effic
06c0: 69 65 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74  ient to add just
06d0: 20 74 68 65 20 22 61 22 20 76 61 6c 75 65 73 20   the "a" values 
06e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61  to the sorter, a
06f0: 6e 64 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  nd.** retrieve t
0700: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 62  he associated "b
0710: 69 67 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64  igblob" values d
0720: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
0730: 6c 65 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20  le t1 as the.** 
0740: 31 30 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20  10 smallest "a" 
0750: 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
0760: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f  cted from the so
0770: 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rter..**.** When
0780: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
0790: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
07a0: 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 65 72  on is used, ther
07b0: 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69  e is one entry i
07c0: 6e 20 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b  n the.** aDefer[
07d0: 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68  ] array for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
07f0: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 61 64  that may be read
0800: 20 61 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   as values are.*
0810: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
0820: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
0830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0840: 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a  ortCtx SortCtx;.
0850: 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b  struct SortCtx {
0860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0870: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
0880: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0890: 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f  UP BY clause) */
08a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20  .  int nOBSat;  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08c0: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
08d0: 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
08e0: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  y indices */.  i
08f0: 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20  nt iECursor;    
0900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0910: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f  umber for the so
0920: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rter */.  int re
0930: 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20  gReturn;        
0940: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
0950: 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74  ing block-output
0960: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
0970: 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b  */.  int labelBk
0980: 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  Out;       /* St
0990: 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  art label for th
09a0: 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73  e block-output s
09b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
09c0: 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
09d0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
09e0: 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  of the OP_Sorter
09f0: 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45  Open or OP_OpenE
0a00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e  phemeral */.  in
0a10: 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  t labelDone;    
0a20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0a30: 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20   when done, ex: 
0a40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f  LIMIT reached */
0a50: 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b  .  u8 sortFlags;
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
0a70: 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41   or more SORTFLA
0a80: 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38  G_* bits */.  u8
0a90: 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f   bOrderedInnerLo
0aa0: 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  op; /* ORDER BY 
0ab0: 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20  correctly sorts 
0ac0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
0ad0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0ae0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
0af0: 46 45 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44  FERENCES.  u8 nD
0b00: 65 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  efer;           
0b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
0b20: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
0b30: 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72  Defer[] */.  str
0b40: 75 63 74 20 44 65 66 65 72 72 65 64 43 73 72 20  uct DeferredCsr 
0b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
0b60: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  b;        /* Tab
0b70: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  le definition */
0b80: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20  .    int iCsr;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0ba0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
0bb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
0bc0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Key;           /
0bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  * Number of PK c
0be0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65  olumns for table
0bf0: 20 70 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20   pTab (>=1) */. 
0c00: 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65   } aDefer[4];.#e
0c10: 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 52 6f  ndif.  struct Ro
0c20: 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44 65 66 65  wLoadInfo *pDefe
0c30: 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a  rredRowLoad;  /*
0c40: 20 44 65 66 65 72 72 65 64 20 72 6f 77 20 6c 6f   Deferred row lo
0c50: 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55  ading info or NU
0c60: 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  LL */.};.#define
0c70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0c80: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0c90: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0ca0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0cb0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0cc0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0cd0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0ce0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
0cf0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
0d00: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0d10: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0d20: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0d30: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0d40: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0d50: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0d60: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0d70: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0d80: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0d90: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0da0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0db0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
0dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0dd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0de0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
0df0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0e00: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0e10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e30: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0e50: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e70: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e80: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0e90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0ea0: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0eb0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ec0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ed0: 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20 20 20  pWinDefn) ){.   
0ee0: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
0ef0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0f00: 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20 20 20  ->pWinDefn);.   
0f10: 20 7d 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46   }.    if( OK_IF
0f20: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0f30: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0f40: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0f50: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0f60: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0f70: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0f80: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0f90: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0fa0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0fb0: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0fc0: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0fd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0fe0: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0ff0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
1000: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
1010: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
1020: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
1030: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
1040: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
1050: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
1060: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
1070: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
1080: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
1090: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
10a0: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
10b0: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
10c0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
10d0: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
10e0: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
10f0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
1100: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1110: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1120: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1130: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1140: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
1150: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
1160: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
1170: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1180: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
1190: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
11a0: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
11b0: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
11c0: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
11d0: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
11e0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
11f0: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
1200: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
1210: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
1220: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
1230: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
1240: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
1250: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1260: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
1270: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
1280: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
1290: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
12a0: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
12b0: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
12c0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
12d0: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
12e0: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
12f0: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
1300: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
1310: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
1320: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
1330: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
1340: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
1350: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1360: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1370: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1380: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1390: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
13a0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
13b0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
13c0: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
13d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
13e0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
13f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1420: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
1430: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
1440: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
1450: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
1460: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1470: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1480: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1490: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
14a0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
14b0: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
14c0: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
14d0: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
14e0: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
14f0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1500: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
1510: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1520: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
1530: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
1540: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
1550: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
1560: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1570: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1580: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1590: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
15a0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
15b0: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
15c0: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
15d0: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
15e0: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
15f0: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
1600: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1610: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
1620: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
1630: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
1640: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1650: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
1660: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20  .  pNew->pWin = 
1670: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44  0;.  pNew->pWinD
1680: 65 66 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  efn = 0;.  if( p
1690: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16a0: 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20  cFailed ) {.    
16b0: 63 6c 65 61 72 53 65 6c 65 63 74 28 70 50 61 72  clearSelect(pPar
16c0: 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 70 4e  se->db, pNew, pN
16d0: 65 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20  ew!=&standin);. 
16e0: 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d     pNew = 0;.  }
16f0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1700: 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20  ( pNew->pSrc!=0 
1710: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
1720: 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0 );.  }.  asser
1730: 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  t( pNew!=&standi
1740: 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  n );.  return pN
1750: 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43  ew;.}..#if SELEC
1760: 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  TTRACE_ENABLED./
1770: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
1780: 65 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62  e of a Select ob
1790: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
17a0: 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
17b0: 65 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e  e(Select *p, con
17c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
17d0: 0a 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d  .  if( p && zNam
17e0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
17f0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1800: 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70  (p->zSelName), p
1810: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22  ->zSelName, "%s"
1820: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  , zName);.  }.}.
1830: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
1840: 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20  elete the given 
1850: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
1860: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
1870: 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  substructures..*
1880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1890: 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74  lectDelete(sqlit
18a0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
18b0: 70 29 7b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  p){.  if( OK_IF_
18c0: 41 4c 57 41 59 53 5f 54 52 55 45 28 70 29 20 29  ALWAYS_TRUE(p) )
18d0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
18e0: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
18f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1900: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1910: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1920: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1930: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1940: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1950: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1960: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1970: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
1980: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1990: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
19a0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
19b0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
19c0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
19d0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
19e0: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
19f0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1a00: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1a10: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1a20: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1a30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1a40: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1a50: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1a60: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1a70: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
1a80: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
1a90: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
1aa0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
1ab0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
1ac0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
1ad0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1ae0: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1af0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1b00: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1b10: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1b20: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1b30: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1b40: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1b50: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1b60: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1b70: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1b80: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
1b90: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1ba0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
1bb0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
1bc0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
1bd0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1be0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1c10: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1c20: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1c30: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1c40: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1c50: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1c60: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1c70: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
1c80: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
1c90: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
1ca0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
1cb0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
1cc0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
1cd0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1ce0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1cf0: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1d00: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1d10: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1d20: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1d30: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1d40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1d50: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1d60: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1d80: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
1d90: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
1da0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
1db0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
1dc0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
1dd0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1df0: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1e00: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1e10: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1e20: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1e30: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1e40: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1e50: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1e60: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1e70: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1e80: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1e90: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ea0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1eb0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ec0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1ed0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1ee0: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1ef0: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1f00: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1f10: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1f20: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1f30: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1f40: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1f50: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1f60: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1f70: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1f80: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1f90: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1fa0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1fb0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1fc0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1fd0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1ff0: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
2000: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
2010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2020: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
2030: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
2040: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
2050: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
2060: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
2070: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
2080: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
2090: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
20a0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
20b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20c0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
20d0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
20e0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
20f0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
2100: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
2110: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
2120: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
2130: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
2140: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
2150: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
2160: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
2170: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
2180: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2190: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
21a0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
21b0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
21c0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
21d0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
21e0: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
21f0: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
2200: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
2210: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
2220: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
2230: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
2240: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
2250: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2260: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
2270: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
2280: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
2290: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
22a0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
22b0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
22c0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
22d0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
22e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22f0: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
2300: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
2310: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
2320: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
2330: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
2340: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
2350: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
2360: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
2370: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2380: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
2390: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
23a0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
23b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
23c0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
23d0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
23e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
23f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2400: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2410: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2420: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2430: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2440: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2450: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2460: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2470: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
2480: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
2490: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
24a0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
24b0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
24c0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
24d0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
24e0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
24f0: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2500: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2520: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2530: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2540: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2550: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2560: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2570: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
2580: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
2590: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
25a0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
25b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
25c0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
25d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
25e0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
25f0: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2600: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2610: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2620: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2630: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2640: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2650: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2660: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2670: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
2680: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2690: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
26a0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
26b0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
26c0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
26d0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
26e0: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
26f0: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2700: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2710: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2720: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2730: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2740: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2750: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2760: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2770: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
2780: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
2790: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
27a0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
27b0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
27c0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
27d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
27e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
27f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2800: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2810: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2820: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2830: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2840: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2850: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2860: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2870: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
2880: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
2890: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
28a0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
28b0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
28c0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
28d0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
28e0: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
28f0: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2900: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2910: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2920: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2930: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2940: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2950: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2960: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2970: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
2980: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
2990: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
29a0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
29b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
29c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29d0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
29e0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
29f0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2a10: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2a20: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2a30: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2a60: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2a70: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2a80: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2ab0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
2ac0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2af0: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2b00: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2b10: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b30: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2b40: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2b50: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2b60: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2b70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2b80: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
2b90: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
2ba0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
2bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2bc0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
2bd0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2be0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2bf0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2c00: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2c10: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2c20: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2c30: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2c40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2c50: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2c70: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
2c80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2c90: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
2ca0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
2cb0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
2cc0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
2cd0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2ce0: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2cf0: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2d00: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2d10: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2d20: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2d30: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2d40: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2d50: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2d60: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2d70: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
2d80: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
2d90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2da0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2db0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
2dc0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2dd0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2de0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2df0: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2e00: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2e10: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2e20: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2e30: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2e40: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2e50: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2e60: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2e70: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2e80: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2e90: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ea0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2eb0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ec0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2ed0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2ee0: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2ef0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2f00: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2f10: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2f20: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2f30: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2f40: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2f50: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2f60: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2f70: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2f80: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2f90: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2fa0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2fb0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2fc0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2fd0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2fe0: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2ff0: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
3000: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
3010: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
3020: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
3030: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
3040: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
3050: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
3060: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
3070: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
3080: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
3090: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
30a0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
30b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30c0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
30d0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
30e0: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
30f0: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
3100: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
3110: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
3120: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
3130: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
3140: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
3150: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
3160: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
3170: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
3180: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
3190: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
31a0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
31b0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
31c0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
31d0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
31e0: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
31f0: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
3200: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
3210: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
3220: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
3230: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
3240: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
3250: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
3260: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
3270: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
3280: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
3290: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
32a0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
32b0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
32c0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
32d0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
32e0: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
32f0: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
3300: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
3310: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
3320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
3330: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
3340: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
3350: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
3360: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
3370: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
3380: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
3390: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
33a0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
33b0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
33c0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
33d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
33e0: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
33f0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3400: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3410: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3420: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3430: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3440: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3450: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3460: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3470: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
3480: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
3490: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
34a0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
34b0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
34c0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
34d0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
34e0: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
34f0: 0a 2f 2a 20 55 6e 64 6f 20 74 68 65 20 77 6f 72  ./* Undo the wor
3500: 6b 20 6f 66 20 73 65 74 4a 6f 69 6e 45 78 70 72  k of setJoinExpr
3510: 28 29 2e 20 20 49 6e 20 74 68 65 20 65 78 70 72  ().  In the expr
3520: 65 73 73 69 6f 6e 20 74 72 65 65 20 70 2c 20 63  ession tree p, c
3530: 6f 6e 76 65 72 74 20 65 76 65 72 79 0a 2a 2a 20  onvert every.** 
3540: 74 65 72 6d 20 74 68 61 74 20 69 73 20 6d 61 72  term that is mar
3550: 6b 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f 6d  ked with EP_From
3560: 4a 6f 69 6e 20 61 6e 64 20 69 52 69 67 68 74 4a  Join and iRightJ
3570: 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  oinTable==iTable
3580: 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69   into.** an ordi
3590: 6e 61 72 79 20 74 65 72 6d 20 74 68 61 74 20 6f  nary term that o
35a0: 6d 69 74 73 20 74 68 65 20 45 50 5f 46 72 6f 6d  mits the EP_From
35b0: 4a 6f 69 6e 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a  Join mark..**.**
35c0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
35d0: 65 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 69  en a LEFT JOIN i
35e0: 73 20 73 69 6d 70 6c 69 66 69 65 64 20 69 6e 74  s simplified int
35f0: 6f 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f  o an ordinary JO
3600: 49 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  IN..*/.static vo
3610: 69 64 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72  id unsetJoinExpr
3620: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
3630: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
3640: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  p ){.    if( Exp
3650: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
3660: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
3670: 20 20 26 26 20 28 69 54 61 62 6c 65 3c 30 20 7c    && (iTable<0 |
3680: 7c 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  | p->iRightJoinT
3690: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 29 20 29 7b  able==iTable) ){
36a0: 0a 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72  .      ExprClear
36b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
36c0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a  romJoin);.    }.
36d0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
36e0: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d  K_FUNCTION && p-
36f0: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
3700: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
3710: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70  or(i=0; i<p->x.p
3720: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3730: 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  ){.        unset
3740: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c  JoinExpr(p->x.pL
3750: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
3760: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
3770: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 73 65  }.    }.    unse
3780: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
3790: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
37a0: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
37b0: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
37c0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
37d0: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
37e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
37f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3800: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
3810: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
3820: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
3830: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
3840: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
3850: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
3860: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
3870: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3880: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
3890: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
38a0: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
38b0: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
38c0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
38d0: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
38e0: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
38f0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
3900: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
3910: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
3920: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
3930: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
3940: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
3950: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
3960: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
3970: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
3980: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
3990: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
39a0: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
39b0: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
39c0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
39d0: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
39e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
39f0: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
3a00: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
3a10: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
3a20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3a30: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
3a40: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
3a50: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
3a60: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
3a70: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
3a80: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
3a90: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
3aa0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
3ab0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
3ac0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
3ad0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
3ae0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3b00: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
3b10: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3b20: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
3b30: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
3b40: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
3b50: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3b60: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
3b70: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
3b80: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
3b90: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
3ba0: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
3bb0: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
3bc0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
3bd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
3be0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
3bf0: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
3c00: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
3c10: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
3c20: 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e  ht->pTab;.    in
3c30: 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20  t isOuter;..    
3c40: 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 2d  if( NEVER(pLeft-
3c50: 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  >pTab==0 || pRig
3c60: 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74  htTab==0) ) cont
3c70: 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65  inue;.    isOute
3c80: 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e  r = (pRight->fg.
3c90: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
3ca0: 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  TER)!=0;..    /*
3cb0: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
3cc0: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
3cd0: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
3ce0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
3cf0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
3d00: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
3d10: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
3d20: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
3d30: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3d40: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
3d50: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
3d60: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3d70: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
3d80: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
3d90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3da0: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
3db0: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
3dc0: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
3dd0: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
3de0: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
3df0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3e10: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3e20: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
3e30: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3e40: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
3e50: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
3e60: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
3e70: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3e80: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
3e90: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
3ea0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3eb0: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
3ec0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
3ed0: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
3ee0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3ef0: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3f00: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3f10: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3f20: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3f30: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3f40: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
3f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
3f60: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3f70: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3f80: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
3fb0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
3fc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3fd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
3fe0: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
3ff0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
4000: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
4010: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4020: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
4030: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
4040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
4050: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4060: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
4070: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
4080: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
4090: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
40a0: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
40b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
40c0: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
40d0: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
40e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
40f0: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
4100: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
4110: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
4120: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
4130: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
4140: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
4150: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
4160: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
4170: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
4180: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
4190: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
41a0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
41b0: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
41c0: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
41d0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
41e0: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
41f0: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
4200: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
4210: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
4220: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
4230: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
4240: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
4250: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
4260: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
4270: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
4280: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
4290: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
42a0: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
42b0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
42c0: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
42d0: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
42e0: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
42f0: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
4300: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
4310: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
4320: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
4330: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
4340: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
4350: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
4360: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
4370: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
4380: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
4390: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
43a0: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
43b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
43c0: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
43d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
43e0: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
43f0: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
4400: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
4410: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4420: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
4430: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
4440: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
4450: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
4460: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
4470: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
4480: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
4490: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
44a0: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
44b0: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
44c0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
44d0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
44e0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
44f0: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
4500: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
4510: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
4520: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
4530: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
4540: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
4550: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
4560: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
4570: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
4580: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
4590: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
45a0: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
45b0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
45c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
45d0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
45e0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
45f0: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
4600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
4610: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
4620: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
4630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
4640: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
4650: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
4660: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
4670: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
4680: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
4690: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
46a0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
46b0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
46c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
46d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
46e0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
46f0: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
4700: 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74  t holds informat
4710: 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70 50 61 72  ion (beyond pPar
4720: 73 65 20 61 6e 64 20 70 53 65 6c 65 63 74 29 0a  se and pSelect).
4730: 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20 6c 6f 61  ** needed to loa
4740: 64 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  d the next resul
4750: 74 20 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f  t row that is to
4760: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
4770: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70 65   sorter..*/.type
4780: 64 65 66 20 73 74 72 75 63 74 20 52 6f 77 4c 6f  def struct RowLo
4790: 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61 64 49 6e  adInfo RowLoadIn
47a0: 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f 77 4c 6f  fo;.struct RowLo
47b0: 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20 72  adInfo {.  int r
47c0: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
47d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
47e0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 72 72 61   results in arra
47f0: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68  y of registers h
4800: 65 72 65 20 2a 2f 0a 20 20 75 38 20 65 63 65 6c  ere */.  u8 ecel
4810: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
4820: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 61 72        /* Flag ar
4830: 67 75 6d 65 6e 74 20 74 6f 20 45 78 70 72 43 6f  gument to ExprCo
4840: 64 65 45 78 70 72 4c 69 73 74 28 29 20 2a 2f 0a  deExprList() */.
4850: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4860: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
4870: 52 45 4e 43 45 53 0a 20 20 45 78 70 72 4c 69 73  RENCES.  ExprLis
4880: 74 20 2a 70 45 78 74 72 61 3b 20 20 20 20 20 20  t *pExtra;      
4890: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 63        /* Extra c
48a0: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 62 79  olumns needed by
48b0: 20 73 6f 72 74 65 72 20 72 65 66 73 20 2a 2f 0a   sorter refs */.
48c0: 20 20 69 6e 74 20 72 65 67 45 78 74 72 61 52 65    int regExtraRe
48d0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 2f  sult;          /
48e0: 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f 61 64 20  * Where to load 
48f0: 74 68 65 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  the extra column
4900: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  s */.#endif.};..
4910: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4920: 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
4930: 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71 75 65 72   of loading quer
4940: 79 20 64 61 74 61 20 69 6e 74 6f 20 61 6e 20 61  y data into an a
4950: 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65 67 69 73  rray of.** regis
4960: 74 65 72 73 20 73 6f 20 74 68 61 74 20 69 74 20  ters so that it 
4970: 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f 20  can be added to 
4980: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
4990: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 6e 65 72  tatic void inner
49a0: 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a 20 20 50  LoopLoadRow(.  P
49b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
49c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
49d0: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
49e0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
49f0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
4a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4a10: 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 64   query being cod
4a20: 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49  ed */.  RowLoadI
4a30: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
4a40: 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65 65 64 65     /* Info neede
4a50: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
4a60: 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f 0a 29 7b  e row load */.){
4a70: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
4a80: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
4a90: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
4aa0: 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65 67 52 65  st, pInfo->regRe
4ab0: 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20  sult,.          
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65 6c 46 6c  0, pInfo->ecelFl
4ae0: 61 67 73 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ags);.#ifdef SQL
4af0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
4b00: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 69  R_REFERENCES.  i
4b10: 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61  f( pInfo->pExtra
4b20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4b30: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
4b40: 70 50 61 72 73 65 2c 20 70 49 6e 66 6f 2d 3e 70  pParse, pInfo->p
4b50: 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d 3e 72 65  Extra, pInfo->re
4b60: 67 45 78 74 72 61 52 65 73 75 6c 74 2c 20 30 2c  gExtraResult, 0,
4b70: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4b80: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
4b90: 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 66 6f  Parse->db, pInfo
4ba0: 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20 7d 0a 23  ->pExtra);.  }.#
4bb0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
4bc0: 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ode the OP_MakeR
4bd0: 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f  ecord instructio
4be0: 6e 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  n that generates
4bf0: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65   the entry to be
4c00: 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74 6f 20 74  .** added into t
4c10: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a 2a  he sorter..**.**
4c20: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
4c30: 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ster in which th
4c40: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
4c50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
4c60: 74 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f  t makeSorterReco
4c70: 72 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rd(.  Parse *pPa
4c80: 72 73 65 2c 0a 20 20 53 6f 72 74 43 74 78 20 2a  rse,.  SortCtx *
4c90: 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65 63 74 20  pSort,.  Select 
4ca0: 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69 6e 74 20  *pSelect,.  int 
4cb0: 72 65 67 42 61 73 65 2c 0a 20 20 69 6e 74 20 6e  regBase,.  int n
4cc0: 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74 20 6e 4f  Base.){.  int nO
4cd0: 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f  BSat = pSort->nO
4ce0: 42 53 61 74 3b 0a 20 20 56 64 62 65 20 2a 76 20  BSat;.  Vdbe *v 
4cf0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
4d00: 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 3d 20  .  int regOut = 
4d10: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
4d20: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 70 44 65    if( pSort->pDe
4d30: 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 29 7b  ferredRowLoad ){
4d40: 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f  .    innerLoopLo
4d50: 61 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70 53  adRow(pParse, pS
4d60: 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d 3e 70 44  elect, pSort->pD
4d70: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 29 3b  eferredRowLoad);
4d80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4d90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4da0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
4db0: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
4dc0: 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f 75 74 29  -nOBSat, regOut)
4dd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 4f 75  ;.  return regOu
4de0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
4df0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
4e00: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
4e10: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
4e20: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
4e30: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
4e40: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
4e50: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4e60: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
4e70: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4e80: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
4e90: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4ea0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
4eb0: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
4ec0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4ed0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4ee0: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
4ef0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4f00: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
4f10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
4f20: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
4f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4f40: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
4f50: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
4f60: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
4f70: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
4f80: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4f90: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4fa0: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
4fb0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4fd0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4fe0: 73 20 69 6e 20 74 68 65 20 72 65 67 44 61 74 61  s in the regData
4ff0: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
5000: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
5010: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
5020: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
5030: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
5040: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
5050: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
5060: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
5090: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
50a0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
50b0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
50c0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
50d0: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
50e0: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
50f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5110: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
5120: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
5130: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
5140: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
5170: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
5180: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51b0: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
51c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
51d0: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 30 3b 20   regRecord = 0; 
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5200: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
5210: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
5220: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
5230: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5250: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
5260: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
5270: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
52a0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
52b0: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69  to sorter */.  i
52c0: 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20 20  nt iLimit;      
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e 74    /* LIMIT count
52f0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6b 69  er */.  int iSki
5300: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
5310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
5320: 64 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20  d of the sorter 
5330: 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a 2f 0a 0a  insert loop */..
5340: 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d    assert( bSeq==
5350: 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a  0 || bSeq==1 );.
5360: 0a 20 20 2f 2a 20 54 68 72 65 65 20 63 61 73 65  .  /* Three case
5370: 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68  s:.  **   (1) Th
5380: 65 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72  e data to be sor
5390: 74 65 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ted has already 
53a0: 62 65 65 6e 20 70 61 63 6b 65 64 20 69 6e 74 6f  been packed into
53b0: 20 61 20 52 65 63 6f 72 64 0a 20 20 2a 2a 20 20   a Record.  **  
53c0: 20 20 20 20 20 62 79 20 61 20 70 72 69 6f 72 20       by a prior 
53d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  OP_MakeRecord.  
53e0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e 44 61  In this case nDa
53f0: 74 61 3d 3d 31 20 61 6e 64 20 72 65 67 44 61 74  ta==1 and regDat
5400: 61 0a 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c  a.  **       wil
5410: 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l be completely 
5420: 75 6e 72 65 6c 61 74 65 64 20 74 6f 20 72 65 67  unrelated to reg
5430: 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20  OrigData..  **  
5440: 20 28 32 29 20 41 6c 6c 20 6f 75 74 70 75 74 20   (2) All output 
5450: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69 6e 63 6c  columns are incl
5460: 75 64 65 64 20 69 6e 20 74 68 65 20 73 6f 72 74  uded in the sort
5470: 20 72 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 61   record.  In tha
5480: 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 63 61 73  t.  **       cas
5490: 65 20 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72  e regData==regOr
54a0: 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20 20 28  igData..  **   (
54b0: 33 29 20 53 6f 6d 65 20 6f 75 74 70 75 74 20 63  3) Some output c
54c0: 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d 69 74 74  olumns are omitt
54d0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  ed from the sort
54e0: 20 72 65 63 6f 72 64 20 64 75 65 20 74 6f 0a 20   record due to. 
54f0: 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 53 51   **       the SQ
5500: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5510: 45 52 5f 52 45 46 45 52 45 4e 43 45 20 6f 70 74  ER_REFERENCE opt
5520: 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75  imization, or du
5530: 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 20 20  e to the.  **   
5540: 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
5550: 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d 69 7a 61  OMITREF optimiza
5560: 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20  tion, or due to 
5570: 74 68 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  the .  **       
5580: 53 6f 72 74 43 74 78 2e 70 44 65 66 65 72 72 65  SortCtx.pDeferre
5590: 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69 6d 69 61  dRowLoad optimia
55a0: 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79 20 6f 66  tion.  In any of
55b0: 20 74 68 65 73 65 20 63 61 73 65 73 0a 20 20 2a   these cases.  *
55c0: 2a 20 20 20 20 20 20 20 72 65 67 4f 72 69 67 44  *       regOrigD
55d0: 61 74 61 20 69 73 20 30 20 74 6f 20 70 72 65 76  ata is 0 to prev
55e0: 65 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ent this routine
55f0: 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
5600: 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20 20 20 20  copy.  **       
5610: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 69 67 68  values that migh
5620: 74 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  t not yet exist.
5630: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
5640: 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67 44  nData==1 || regD
5650: 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61  ata==regOrigData
5660: 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74 61 3d   || regOrigData=
5670: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 72  =0 );..  if( nPr
5680: 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61  efixReg ){.    a
5690: 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65  ssert( nPrefixRe
56a0: 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b  g==nExpr+bSeq );
56b0: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72  .    regBase = r
56c0: 65 67 44 61 74 61 20 2d 20 6e 50 72 65 66 69 78  egData - nPrefix
56d0: 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
56e0: 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72    regBase = pPar
56f0: 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
5700: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
5710: 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61  = nBase;.  }.  a
5720: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d 3e  ssert( pSelect->
5730: 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53  iOffset==0 || pS
5740: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30  elect->iLimit!=0
5750: 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70   );.  iLimit = p
5760: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20  Select->iOffset 
5770: 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ? pSelect->iOffs
5780: 65 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e  et+1 : pSelect->
5790: 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d  iLimit;.  pSort-
57a0: 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c  >labelDone = sql
57b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
57c0: 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  l(v);.  sqlite3E
57d0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
57e0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70  pParse, pSort->p
57f0: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
5800: 2c 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20  , regOrigData,. 
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5830: 45 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f  ECEL_DUP | (regO
5840: 72 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f  rigData? SQLITE_
5850: 45 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a  ECEL_REF : 0));.
5860: 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20    if( bSeq ){.  
5870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5880: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
5890: 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  ce, pSort->iECur
58a0: 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  sor, regBase+nEx
58b0: 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  pr);.  }.  if( n
58c0: 50 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20  PrefixReg==0 && 
58d0: 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73  nData>0 ){.    s
58e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
58f0: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
5900: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
5910: 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a  r+bSeq, nData);.
5920: 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61 74    }.  if( nOBSat
5930: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  >0 ){.    int re
5940: 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54  gPrevKey;   /* T
5950: 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20  he first nOBSat 
5960: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70  columns of the p
5970: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
5980: 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74     int addrFirst
5990: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
59a0: 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20  of the OP_IfNot 
59b0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  opcode */.    in
59c0: 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20  t addrJmp;      
59d0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
59e0: 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65  e OP_Jump opcode
59f0: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   */.    VdbeOp *
5a00: 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63  pOp;      /* Opc
5a10: 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74  ode that opens t
5a20: 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
5a30: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
5a40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5a50: 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75  sorting key colu
5a60: 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f  mns, including O
5a70: 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  P_Sequence */.  
5a80: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20    KeyInfo *pKI; 
5a90: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
5aa0: 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73  KeyInfo on the s
5ab0: 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a  orter table */..
5ac0: 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
5ad0: 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64  makeSorterRecord
5ae0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
5af0: 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65  pSelect, regBase
5b00: 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20 20 72 65  , nBase);.    re
5b10: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
5b20: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
5b30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
5b40: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
5b50: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
5b60: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
5b70: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
5b80: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
5b90: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
5ba0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5bb0: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
5bc0: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
5bd0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
5be0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
5bf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
5c00: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
5c10: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
5c20: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
5c30: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
5c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5c50: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
5c60: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
5c70: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
5c80: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
5c90: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
5ca0: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
5cb0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
5cc0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
5cd0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
5ce0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
5cf0: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
5d00: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
5d10: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
5d20: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
5d30: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
5d40: 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61  KeyField); /* Ma
5d50: 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73 74  kes OP_Jump test
5d60: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
5d70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
5d80: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b  v, -1, (char*)pK
5d90: 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  I, P4_KEYINFO);.
5da0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
5db0: 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20 70  I->nAllField > p
5dc0: 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32 20  KI->nKeyField+2 
5dd0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
5de0: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
5df0: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
5e00: 4c 69 73 74 28 70 50 61 72 73 65 2c 70 53 6f 72  List(pParse,pSor
5e10: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42 53  t->pOrderBy,nOBS
5e20: 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  at,.            
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5e50: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b  KI->nAllField-pK
5e60: 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b  I->nKeyField-1);
5e70: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
5e80: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5e90: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
5ea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5eb0: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
5ec0: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
5ed0: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
5ee0: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
5ef0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
5f00: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5f10: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
5f20: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
5f30: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
5f40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5f50: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
5f60: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
5f70: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
5f80: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
5f90: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5fa0: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
5fb0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
5fc0: 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69  );.    if( iLimi
5fd0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5fe0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5ff0: 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
6000: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f  , pSort->labelDo
6010: 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ne);.      VdbeC
6020: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6030: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
6040: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
6050: 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c  rFirst);.    sql
6060: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
6070: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
6080: 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53  , regPrevKey, pS
6090: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
60a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
60b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70  pHere(v, addrJmp
60c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4c 69  );.  }.  if( iLi
60d0: 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 74  mit ){.    /* At
60e0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
60f0: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 6e  values for the n
6100: 65 77 20 73 6f 72 74 65 72 20 65 6e 74 72 79 20  ew sorter entry 
6110: 61 72 65 20 73 74 6f 72 65 64 0a 20 20 20 20 2a  are stored.    *
6120: 2a 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  * in an array of
6130: 20 72 65 67 69 73 74 65 72 73 2e 20 54 68 65 79   registers. They
6140: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6d 70   need to be comp
6150: 6f 73 65 64 20 69 6e 74 6f 20 61 20 72 65 63 6f  osed into a reco
6160: 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 6e  rd.    ** and in
6170: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
6180: 73 6f 72 74 65 72 20 69 66 20 65 69 74 68 65 72  sorter if either
6190: 20 28 61 29 20 74 68 65 72 65 20 61 72 65 20 63   (a) there are c
61a0: 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  urrently.    ** 
61b0: 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d 49 54 2b  less than LIMIT+
61c0: 4f 46 46 53 45 54 20 69 74 65 6d 73 20 6f 72 20  OFFSET items or 
61d0: 28 62 29 20 74 68 65 20 6e 65 77 20 72 65 63 6f  (b) the new reco
61e0: 72 64 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  rd is smaller th
61f0: 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  an .    ** the l
6200: 61 72 67 65 73 74 20 72 65 63 6f 72 64 20 63 75  argest record cu
6210: 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 73  rrently in the s
6220: 6f 72 74 65 72 2e 20 49 66 20 28 62 29 20 69 73  orter. If (b) is
6230: 20 74 72 75 65 20 61 6e 64 20 74 68 65 72 65 0a   true and there.
6240: 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
6250: 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  dy LIMIT+OFFSET 
6260: 69 74 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72  items in the sor
6270: 74 65 72 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ter, delete the 
6280: 6c 61 72 67 65 73 74 0a 20 20 20 20 2a 2a 20 65  largest.    ** e
6290: 6e 74 72 79 20 62 65 66 6f 72 65 20 69 6e 73 65  ntry before inse
62a0: 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  rting the new on
62b0: 65 2e 20 54 68 69 73 20 77 61 79 20 74 68 65 72  e. This way ther
62c0: 65 20 61 72 65 20 6e 65 76 65 72 20 6d 6f 72 65  e are never more
62d0: 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 4c 49   .    ** than LI
62e0: 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73  MIT+OFFSET items
62f0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 0a   in the sorter..
6300: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
6310: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
6320: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
6330: 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
6340: 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 0a 20 20  o the sorter,.  
6350: 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 74 68 65    ** jump to the
6360: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
6370: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 4f 72 2c  of the loop. Or,
6380: 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   if the.    ** p
6390: 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Sort->bOrderedIn
63a0: 6e 65 72 4c 6f 6f 70 20 66 6c 61 67 20 69 73 20  nerLoop flag is 
63b0: 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20  set to indicate 
63c0: 74 68 61 74 20 74 68 65 20 69 6e 6e 65 72 0a 20  that the inner. 
63d0: 20 20 20 2a 2a 20 6c 6f 6f 70 20 64 65 6c 69 76     ** loop deliv
63e0: 65 72 73 20 69 74 65 6d 73 20 69 6e 20 73 6f 72  ers items in sor
63f0: 74 65 64 20 6f 72 64 65 72 2c 20 6a 75 6d 70 20  ted order, jump 
6400: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
6410: 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20  ation.    ** of 
6420: 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
6430: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
6440: 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43  Csr = pSort->iEC
6450: 75 72 73 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  ursor;.    sqlit
6460: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6470: 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c  OP_IfNotZero, iL
6480: 69 6d 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  imit, sqlite3Vdb
6490: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
64a0: 34 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  4);.    VdbeCove
64b0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
64c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
64d0: 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 43 73 72 2c  , OP_Last, iCsr,
64e0: 20 30 29 3b 0a 20 20 20 20 69 53 6b 69 70 20 3d   0);.    iSkip =
64f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6500: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c  p4Int(v, OP_IdxL
6510: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 20 20 20 20 69 43 73 72 2c 20 30 2c 20 72 65 67      iCsr, 0, reg
6540: 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 45 78  Base+nOBSat, nEx
6550: 70 72 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  pr-nOBSat);.    
6560: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6580: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
6590: 65 74 65 2c 20 69 43 73 72 29 3b 0a 20 20 7d 0a  ete, iCsr);.  }.
65a0: 20 20 69 66 28 20 72 65 67 52 65 63 6f 72 64 3d    if( regRecord=
65b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 67 52 65 63  =0 ){.    regRec
65c0: 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72 74 65 72  ord = makeSorter
65d0: 52 65 63 6f 72 64 28 70 50 61 72 73 65 2c 20 70  Record(pParse, p
65e0: 53 6f 72 74 2c 20 70 53 65 6c 65 63 74 2c 20 72  Sort, pSelect, r
65f0: 65 67 42 61 73 65 2c 20 6e 42 61 73 65 29 3b 0a  egBase, nBase);.
6600: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
6610: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
6620: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
6630: 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53  ){.    op = OP_S
6640: 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d  orterInsert;.  }
6650: 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  else{.    op = O
6660: 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d  P_IdxInsert;.  }
6670: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6680: 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70  dOp4Int(v, op, p
6690: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20  Sort->iECursor, 
66a0: 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20  regRecord,.     
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66c0: 20 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74    regBase+nOBSat
66d0: 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29 3b  , nBase-nOBSat);
66e0: 0a 20 20 69 66 28 20 69 53 6b 69 70 20 29 7b 0a  .  if( iSkip ){.
66f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72      assert( pSor
6700: 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  t->bOrderedInner
6710: 4c 6f 6f 70 3d 3d 30 20 7c 7c 20 70 53 6f 72 74  Loop==0 || pSort
6720: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
6730: 6f 6f 70 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  oop==1 );.    sq
6740: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6750: 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20 20 20 20  2(v, iSkip,.    
6760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6770: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
6780: 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64   pSort->bOrdered
6790: 49 6e 6e 65 72 4c 6f 6f 70 29 3b 0a 20 20 7d 0a  InnerLoop);.  }.
67a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
67b0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
67c0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
67d0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
67e0: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
67f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6800: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6810: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
6820: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
6830: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
6840: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
6850: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
6860: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
6870: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
6880: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
6890: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
68a0: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
68b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
68c0: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
68d0: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
68e0: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
68f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
6900: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
6910: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
6920: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
6930: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
6940: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
6950: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
6960: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
6970: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
6980: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
6990: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
69a0: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
69b0: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
69c0: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
69d0: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
69e0: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
69f0: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
6a00: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
6a10: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
6a20: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
6a30: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
6a40: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
6a50: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
6a60: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
6a70: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
6a80: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
6a90: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
6aa0: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
6ab0: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
6ac0: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
6ad0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6ae0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6af0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
6b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
6b10: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
6b20: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
6b30: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
6b40: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
6b50: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
6b60: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
6b70: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6b90: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6ba0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
6bb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
6bc0: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
6bd0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6be0: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
6bf0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
6c00: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6c10: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6c20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6c30: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
6c40: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
6c50: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
6c60: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
6c70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c80: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6c90: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
6ca0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6cb0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
6cc0: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
6cd0: 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  1, iMem, N);.  s
6ce0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6cf0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
6d00: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
6d10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6d20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6d30: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6d40: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
6d50: 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a  _REFERENCES./*.*
6d60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6d70: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
6d80: 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20  t of inner-loop 
6d90: 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f 72 20 61  generation for a
6da0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
6db0: 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 4f 52 44  ment with an ORD
6dc0: 45 52 20 42 59 20 74 68 61 74 20 69 73 20 6e 6f  ER BY that is no
6dd0: 74 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 61  t optimized by a
6de0: 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20  n index. It .** 
6df0: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 65  determines the e
6e00: 78 70 72 65 73 73 69 6f 6e 73 2c 20 69 66 20 61  xpressions, if a
6e10: 6e 79 2c 20 74 68 61 74 20 74 68 65 20 73 6f 72  ny, that the sor
6e20: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a  ter-reference .*
6e30: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  * optimization s
6e40: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
6e50: 72 2e 20 54 68 65 20 73 6f 72 74 65 72 2d 72 65  r. The sorter-re
6e60: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
6e70: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
6e80: 66 6f 72 20 53 45 4c 45 43 54 20 71 75 65 72 69  for SELECT queri
6e90: 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20  es like:.**.**  
6ea0: 20 53 45 4c 45 43 54 20 61 2c 20 62 69 67 62 6c   SELECT a, bigbl
6eb0: 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  ob FROM t1 ORDER
6ec0: 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a   BY a LIMIT 10.*
6ed0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
6ee0: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
6ef0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
6f00: 22 62 69 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20  "bigblob", then 
6f10: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74  instead of.** st
6f20: 6f 72 69 6e 67 20 76 61 6c 75 65 73 20 72 65 61  oring values rea
6f30: 64 20 66 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75  d from that colu
6f40: 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  mn in the sorter
6f50: 20 72 65 63 6f 72 64 73 2c 20 74 68 65 20 50 4b   records, the PK
6f60: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66   of.** the row f
6f70: 72 6f 6d 20 74 61 62 6c 65 20 74 31 20 69 73 20  rom table t1 is 
6f80: 73 74 6f 72 65 64 20 69 6e 73 74 65 61 64 2e 20  stored instead. 
6f90: 54 68 65 6e 2c 20 61 73 20 72 65 63 6f 72 64 73  Then, as records
6fa0: 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
6fb0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65  rom.** the sorte
6fc0: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 74  r to return to t
6fd0: 68 65 20 75 73 65 72 2c 20 74 68 65 20 72 65 71  he user, the req
6fe0: 75 69 72 65 64 20 76 61 6c 75 65 20 6f 66 20 62  uired value of b
6ff0: 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74  igblob is.** ret
7000: 72 69 65 76 65 64 20 64 69 72 65 63 74 6c 79 20  rieved directly 
7010: 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 2e 20 49  from table t1. I
7020: 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
7030: 20 76 65 72 79 20 6c 61 72 67 65 2c 20 74 68 69   very large, thi
7040: 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72  s .** can be mor
7050: 65 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e  e efficient than
7060: 20 73 74 6f 72 69 6e 67 20 74 68 65 6d 20 64 69   storing them di
7070: 72 65 63 74 6c 79 20 69 6e 20 74 68 65 20 73 6f  rectly in the so
7080: 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  rter records..**
7090: 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c 69 73 74  .** The ExprList
70a0: 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72 52 65 66  _item.bSorterRef
70b0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
70c0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
70d0: 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66   in pEList .** f
70e0: 6f 72 20 77 68 69 63 68 20 74 68 65 20 73 6f 72  or which the sor
70f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70  ter-reference op
7100: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
7110: 64 20 62 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a  d be enabled. .*
7120: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
7130: 74 68 65 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  the pSort->aDefe
7140: 72 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70  r[] array is pop
7150: 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 74 72  ulated with entr
7160: 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63  ies.** for all c
7170: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
7180: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
7190: 73 65 6c 65 63 74 65 64 20 65 78 70 72 65 73 73  selected express
71a0: 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a  ions. Finally..*
71b0: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
71c0: 65 20 28 2a 70 70 45 78 74 72 61 29 20 69 73 20  e (*ppExtra) is 
71d0: 73 65 74 20 74 6f 20 61 6e 20 65 78 70 72 65 73  set to an expres
71e0: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
71f0: 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ning.** expressi
7200: 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65 78 74 72  ons for all extr
7210: 61 20 50 4b 20 76 61 6c 75 65 73 20 74 68 61 74  a PK values that
7220: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
7230: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74  d in the.** sort
7240: 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73  er records..*/.s
7250: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
7260: 74 45 78 70 72 44 65 66 65 72 28 0a 20 20 50 61  tExprDefer(.  Pa
7270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7290: 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
72a0: 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43   here */.  SortC
72b0: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
72c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
72d0: 72 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rter context */.
72e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
72f0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
7300: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
7310: 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 73 6f   destined for so
7320: 72 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rter */.  ExprLi
7330: 73 74 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  st **ppExtra    
7340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
7350: 72 65 73 73 69 6f 6e 73 20 74 6f 20 61 70 70 65  ressions to appe
7360: 6e 64 20 74 6f 20 73 6f 72 74 65 72 20 72 65 63  nd to sorter rec
7370: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
7380: 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66 65 72 20  i;.  int nDefer 
7390: 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  = 0;.  ExprList 
73a0: 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 66  *pExtra = 0;.  f
73b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
73c0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
73d0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
73e0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
73f0: 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a   &pEList->a[i];.
7400: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
7410: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
7420: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7430: 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
7440: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 54 61 62  pExpr;.      Tab
7450: 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
7460: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
7470: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
7480: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
7490: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
74a0: 54 61 62 20 26 26 20 21 49 73 56 69 72 74 75 61  Tab && !IsVirtua
74b0: 6c 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 26  l(pTab).       &
74c0: 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  & (pTab->aCol[pE
74d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f  xpr->iColumn].co
74e0: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
74f0: 5f 53 4f 52 54 45 52 52 45 46 29 0a 20 20 20 20  _SORTERREF).    
7500: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
7510: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
7520: 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72 3b 20 6a  j=0; j<nDefer; j
7530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
7540: 66 28 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72  f( pSort->aDefer
7550: 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78 70 72 2d  [j].iCsr==pExpr-
7560: 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b  >iTable ) break;
7570: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7580: 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65 66 65 72     if( j==nDefer
7590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
75a0: 28 20 6e 44 65 66 65 72 3d 3d 41 72 72 61 79 53  ( nDefer==ArrayS
75b0: 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44 65 66 65  ize(pSort->aDefe
75c0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
75d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
75e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
75f0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b 65           int nKe
7600: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  y = 1;.         
7610: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
7620: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
7630: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7640: 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
7650: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
7660: 20 20 20 20 20 20 20 70 50 6b 20 3d 20 73 71 6c         pPk = sql
7670: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
7680: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
7690: 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20           nKey = 
76a0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  pPk->nKeyCol;.  
76b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
76c0: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
76d0: 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20   k<nKey; k++){. 
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
76f0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7700: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7710: 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b  K_COLUMN, 0, 0);
7720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
7730: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7740: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
7750: 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
7760: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
7770: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
7780: 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
7790: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
77a0: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
77b0: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
77c0: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
77f0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7800: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7810: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7830: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7840: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
7850: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
7860: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
7870: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
7880: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43 73 72  fer[nDefer].iCsr
7890: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
78a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
78b0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66  ort->aDefer[nDef
78c0: 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b  er].nKey = nKey;
78d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 65  .            nDe
78e0: 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  fer++;.         
78f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7900: 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72       pItem->bSor
7910: 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  terRef = 1;.    
7920: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7930: 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 3d 20  pSort->nDefer = 
7940: 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20 2a 70  (u8)nDefer;.  *p
7950: 70 45 78 74 72 61 20 3d 20 70 45 78 74 72 61 3b  pExtra = pExtra;
7960: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
7980: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
7990: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
79a0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
79b0: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
79c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
79d0: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
79e0: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
79f0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
7a00: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
7a10: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
7a20: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
7a30: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
7a40: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
7a50: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
7a60: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
7a70: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
7a80: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
7a90: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
7aa0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
7ab0: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
7ac0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
7ad0: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
7ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
7af0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
7b00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7b10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
7b20: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
7b30: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
7b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7b50: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
7b60: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7b70: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
7b80: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
7b90: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
7ba0: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
7bb0: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
7bc0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
7bd0: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
7be0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
7bf0: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
7c00: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
7c10: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
7c20: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
7c30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
7c40: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
7c50: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
7c60: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
7c70: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
7c80: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
7c90: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7ca0: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
7cb0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
7cc0: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
7cd0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
7ce0: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
7cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
7d00: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
7d10: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
7d20: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
7d30: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7d40: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
7d50: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
7d60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
7d70: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
7d80: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
7d90: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
7da0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
7db0: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
7dc0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
7dd0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
7de0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
7df0: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
7e00: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
7e10: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
7e20: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
7e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7e40: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
7e50: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
7e60: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
7e70: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
7e80: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
7e90: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
7ea0: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20 52 6f  egResult */.  Ro
7eb0: 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77 4c 6f  wLoadInfo sRowLo
7ec0: 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49 6e 66  adInfo;   /* Inf
7ed0: 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64 20 72  o for deferred r
7ee0: 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a 0a 20  ow loading */.. 
7ef0: 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67   /* Usually, reg
7f00: 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  Result is the fi
7f10: 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  rst cell in an a
7f20: 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63  rray of memory c
7f30: 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ells.  ** contai
7f40: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
7f50: 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20   result row. In 
7f60: 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69  this case regOri
7f70: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  g is set to the.
7f80: 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e    ** same value.
7f90: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
7fa0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
7fb0: 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73  ng sent to the s
7fc0: 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20  orter, the.  ** 
7fd0: 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65  values for any e
7fe0: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
7ff0: 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66  are also part of
8000: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72   the sort-key ar
8010: 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66  e omitted.  ** f
8020: 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20  rom this array. 
8030: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
8040: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a  Orig is set to z
8050: 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ero.  */.  int r
8060: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
8070: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
8080: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
8090: 67 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74  g current result
80a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72  s */.  int regOr
80b0: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ig;             
80c0: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
80d0: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75  emory holding fu
80e0: 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29  ll result (or 0)
80f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
8100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
8110: 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  >pEList!=0 );.  
8120: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44  hasDistinct = pD
8130: 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69  istinct ? pDisti
8140: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a  nct->eTnctType :
8150: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
8160: 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72  NOOP;.  if( pSor
8170: 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64  t && pSort->pOrd
8180: 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20  erBy==0 ) pSort 
8190: 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  = 0;.  if( pSort
81a0: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
81b0: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
81c0: 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  t( iContinue!=0 
81d0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
81e0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
81f0: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
8200: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
8210: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
8220: 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c  s..  */.  nResul
8230: 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  tCol = p->pEList
8240: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
8250: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
8260: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  ){.    if( pSort
8270: 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69   ){.      nPrefi
8280: 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  xReg = pSort->pO
8290: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
82a0: 20 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74       if( !(pSort
82b0: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
82c0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
82d0: 29 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b  ) ) nPrefixReg++
82e0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
82f0: 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52  nMem += nPrefixR
8300: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  eg;.    }.    pD
8310: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
8320: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
8330: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
8340: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
8350: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
8360: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
8370: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
8380: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
8390: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
83a0: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
83b0: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
83c0: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
83d0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
83e0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
83f0: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
8400: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
8410: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
8420: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
8430: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
8440: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
8450: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
8460: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
8470: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
8480: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
8490: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
84a0: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
84b0: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
84c0: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
84d0: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
84e0: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
84f0: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
8500: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
8510: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
8520: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
8530: 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20  tCol;.  regOrig 
8540: 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44  = regResult = pD
8550: 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66  est->iSdst;.  if
8560: 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20  ( srcTab>=0 ){. 
8570: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
8580: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
8590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
85a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
85b0: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
85c0: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
85d0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
85e0: 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45  ((v, "%s", p->pE
85f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8600: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
8610: 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54  e if( eDest!=SRT
8620: 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66 64 65  _Exists ){.#ifde
8630: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8640: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
8650: 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  S.    ExprList *
8660: 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65 6e 64  pExtra = 0;.#end
8670: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  if.    /* If the
8680: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
8690: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
86a0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
86b0: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
86c0: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
86d0: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
86e0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
86f0: 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46   */.    u8 ecelF
8700: 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65 63 65  lags;    /* "ece
8710: 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65 76 69  l" is an abbrevi
8720: 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72 43 6f  ation of "ExprCo
8730: 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f 0a 20  deExprList" */. 
8740: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
8750: 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ist;.    if( eDe
8760: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
8770: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
8780: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
8790: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
87a0: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
87b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
87c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
87d0: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
87e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
87f0: 72 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63  rt && hasDistinc
8800: 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53  t==0 && eDest!=S
8810: 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65  RT_EphemTab && e
8820: 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
8830: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
8840: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
8850: 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61  in p->pEList tha
8860: 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61  t is a copy of a
8870: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a  n expression in.
8880: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44        ** the ORD
8890: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ER BY clause (pS
88a0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20  ort->pOrderBy), 
88b0: 73 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  set the associat
88c0: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72  ed .      ** iOr
88d0: 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74  derByCol value t
88e0: 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  o one more than 
88f0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
8900: 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20   ORDER BY .     
8910: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
8920: 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b  ithin the sort-k
8930: 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f  ey that pushOnto
8940: 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65  Sorter() will ge
8950: 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a  nerate..      **
8960: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
8970: 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64   p->pEList field
8980: 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66   to be omitted f
8990: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72  rom the sorted r
89a0: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20  ecord,.      ** 
89b0: 73 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64  saving space and
89c0: 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f   CPU cycles.  */
89d0: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
89e0: 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c   |= (SQLITE_ECEL
89f0: 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f  _OMITREF|SQLITE_
8a00: 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20 20 20  ECEL_REF);..    
8a10: 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e    for(i=pSort->n
8a20: 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e  OBSat; i<pSort->
8a30: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8a40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
8a50: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66  nt j;.        if
8a60: 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  ( (j = pSort->pO
8a70: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
8a80: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
8a90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
8aa0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75  pEList->a[j-1].u
8ab0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
8ac0: 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53   i+1-pSort->nOBS
8ad0: 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  at;.        }.  
8ae0: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
8af0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8b00: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8b10: 20 20 20 73 65 6c 65 63 74 45 78 70 72 44 65 66     selectExprDef
8b20: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
8b30: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 45  , p->pEList, &pE
8b40: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69 66 28  xtra);.      if(
8b50: 20 70 45 78 74 72 61 20 26 26 20 70 50 61 72 73   pExtra && pPars
8b60: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8b70: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  led==0 ){.      
8b80: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
8b90: 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b 20 63  e any extra PK c
8ba0: 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20 74 6f  olumns to add to
8bb0: 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f   the sorter reco
8bc0: 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rds,.        ** 
8bd0: 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61 20 6d  allocate extra m
8be0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
8bf0: 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65 6e 45  adjust the OpenE
8c00: 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 20 20  phemeral .      
8c10: 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
8c20: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
8c30: 74 68 65 20 6c 61 72 67 65 72 20 72 65 63 6f 72  the larger recor
8c40: 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  ds. This is only
8c50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 71 75  .        ** requ
8c60: 69 72 65 64 20 69 66 20 74 68 65 72 65 20 61 72  ired if there ar
8c70: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 49  e one or more WI
8c80: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
8c90: 65 73 20 77 69 74 68 0a 20 20 20 20 20 20 20 20  es with.        
8ca0: 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70 72 69  ** composite pri
8cb0: 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65  mary keys in the
8cc0: 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65 72 5b   SortCtx.aDefer[
8cd0: 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20  ] array.  */.   
8ce0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
8cf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
8d00: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
8d10: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
8d20: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 2b 3d        pOp->p2 +=
8d30: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8d40: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8d50: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
8d60: 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  4.pKeyInfo->nAll
8d70: 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74 72 61  Field += (pExtra
8d80: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
8d90: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
8da0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
8db0: 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b  = pExtra->nExpr;
8dc0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
8dd0: 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
8de0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f 20 61   nResultCol to a
8df0: 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c 75 6d  ccount for colum
8e00: 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d 69 74  ns that are omit
8e10: 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  ted.      ** fro
8e20: 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62 79 20  m the sorter by 
8e30: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
8e40: 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e 63 68  s in this branch
8e50: 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69 73 74   */.      pEList
8e60: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
8e70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8e80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
8e90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
8ea0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78  pEList->a[i].u.x
8eb0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 23  .iOrderByCol>0.#
8ec0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8ed0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
8ee0: 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20 20 7c  ENCES.         |
8ef0: 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62  | pEList->a[i].b
8f00: 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64 69 66  SorterRef.#endif
8f10: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
8f20: 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c        nResultCol
8f30: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  --;.          re
8f40: 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 20  gOrig = 0;.     
8f50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
8f60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
8f70: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 74  gOrig );.      t
8f80: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8f90: 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20 20 20  SRT_Set );.     
8fa0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8fb0: 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20 20 20  ==SRT_Mem );.   
8fc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8fd0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8fe0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
8ff0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9000: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
9010: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
9020: 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73 74 3d  RT_Set || eDest=
9030: 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20  =SRT_Mem .      
9040: 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53       || eDest==S
9050: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20  RT_Coroutine || 
9060: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
9070: 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  t );.    }.    s
9080: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 52  RowLoadInfo.regR
9090: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
90a0: 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49  t;.    sRowLoadI
90b0: 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20 3d 20  nfo.ecelFlags = 
90c0: 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66 64 65  ecelFlags;.#ifde
90d0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
90e0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
90f0: 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e  S.    sRowLoadIn
9100: 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45 78 74  fo.pExtra = pExt
9110: 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  ra;.    sRowLoad
9120: 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52 65 73  Info.regExtraRes
9130: 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c 74 20  ult = regResult 
9140: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
9150: 20 20 69 66 28 20 70 45 78 74 72 61 20 29 20 6e    if( pExtra ) n
9160: 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70 45 78  ResultCol += pEx
9170: 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65 6e 64  tra->nExpr;.#end
9180: 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  if.    if( p->iL
9190: 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28 65 63  imit.     && (ec
91a0: 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  elFlags & SQLITE
91b0: 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29 21 3d  _ECEL_OMITREF)!=
91c0: 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72 65 66  0 .     && nPref
91d0: 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b 0a 20  ixReg>0.    ){. 
91e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f       assert( pSo
91f0: 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rt!=0 );.      a
9200: 73 73 65 72 74 28 20 68 61 73 44 69 73 74 69 6e  ssert( hasDistin
9210: 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ct==0 );.      p
9220: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
9230: 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77 4c 6f  owLoad = &sRowLo
9240: 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 65  adInfo;.      re
9250: 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 7d  gOrig = 0;.    }
9260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 6e 65  else{.      inne
9270: 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70 50 61  rLoopLoadRow(pPa
9280: 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c 6f 61  rse, p, &sRowLoa
9290: 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  dInfo);.    }.  
92a0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
92b0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
92c0: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
92d0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
92e0: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
92f0: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
9300: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
9310: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
9320: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
9330: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
9340: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
9350: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
9360: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
9370: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
9380: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
9390: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
93a0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
93b0: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
93c0: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
93d0: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
93e0: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
93f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
9400: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9410: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
9420: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
9430: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
9440: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
9450: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
9460: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
9470: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
9480: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
9490: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
94a0: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
94b0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
94c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
94d0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
94e0: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
94f0: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
9500: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
9510: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
9520: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
9530: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
9540: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
9550: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
9560: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
9570: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
9580: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
9590: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
95a0: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
95b0: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
95c0: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
95d0: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
95e0: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
95f0: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
9600: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
9610: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
9620: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
9630: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
9640: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
9650: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
9660: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
9670: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
9680: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
9690: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
96a0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
96b0: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
96c0: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
96d0: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
96e0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
96f0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
9700: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
9710: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9720: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
9730: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
9740: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
9750: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
9760: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
9770: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
9780: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
9790: 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20  ResultCol-1 ){. 
97a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
97b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
97c0: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74  OP_Ne, regResult
97d0: 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72  +i, iJump, regPr
97e0: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
97f0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
9800: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
9810: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9830: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
9840: 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69  Result+i, iConti
9850: 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  nue, regPrev+i);
9860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
9870: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9880: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9890: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
98a0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
98b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
98c0: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
98d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
98e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
98f0: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
9900: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9910: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9920: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9930: 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c  ddr(v)==iJump ||
9940: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
9950: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
9960: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9970: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
9980: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
9990: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
99a0: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
99b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
99c0: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
99d0: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
99e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
99f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
9a00: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
9a10: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
9a20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9a30: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
9a40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
9a50: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
9a60: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
9a70: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
9a80: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
9a90: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
9aa0: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
9ab0: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
9ac0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20     regResult);. 
9af0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9b00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9b10: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a  if( pSort==0 ){.
9b20: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
9b30: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
9b40: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
9b50: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
9b60: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
9b70: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
9b80: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
9b90: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
9ba0: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
9bb0: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
9bc0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
9bd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9be0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9bf0: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
9c00: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
9c10: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
9c20: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
9c30: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
9c40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9c50: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
9c60: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
9c70: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
9c80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9c90: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9ca0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
9cb0: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
9cc0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
9ce0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
9cf0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
9d00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
9d10: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
9d20: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
9d30: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
9d40: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
9d50: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
9d60: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
9d70: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
9d80: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
9d90: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
9da0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
9db0: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
9dc0: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
9dd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9de0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
9df0: 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  dxDelete, iParm,
9e00: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9e10: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  ultCol);.      b
9e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9e30: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9e40: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9e50: 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  T */..    /* Sto
9e60: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
9e70: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
9e80: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
9e90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69  .    case SRT_Fi
9ea0: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
9eb0: 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63  _DistFifo:.    c
9ec0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
9ed0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
9ee0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
9ef0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
9f00: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
9f10: 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  e, nPrefixReg+1)
9f20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
9f40: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
9f50: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
9f60: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
9f70: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
9f80: 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st==SRT_Fifo );.
9f90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9fa0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
9fb0: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ifo );.      sql
9fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9fd0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9fe0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9ff0: 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66  ultCol, r1+nPref
a000: 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20  ixReg);.#ifndef 
a010: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
a020: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
a030: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b  =SRT_DistFifo ){
a040: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
a050: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
a060: 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e  s DistFifo, then
a070: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
a080: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
a090: 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d    ** on an ephem
a0a0: 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74  eral index. If t
a0b0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
a0c0: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
a0d0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
a0e0: 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f  the index, do no
a0f0: 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
a100: 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74  e output. If not
a110: 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20  , add the.      
a120: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77    ** current row
a130: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e   to the index an
a140: 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77  d proceed with w
a150: 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65  riting it to the
a160: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
a170: 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c  ut table as well
a180: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  .  */.        in
a190: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
a1a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a1b0: 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  v) + 4;.        
a1c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a1d0: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
a1e0: 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c  , iParm+1, addr,
a1f0: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
a200: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a210: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a220: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
a230: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a240: 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52  iParm+1, r1,regR
a250: 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c  esult,nResultCol
a260: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a270: 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20  t( pSort==0 );. 
a280: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a290: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
a2a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a2b0: 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65 67 4f   regResult==regO
a2c0: 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  rig );.        p
a2d0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
a2e0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
a2f0: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 72  r1+nPrefixReg, r
a300: 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72 65 66  egOrig, 1, nPref
a310: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
a320: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
a330: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = 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 20 20 73 71 6c 69 74 65 33  .        sqlite3
a360: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a370: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
a380: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
a390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a3a0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
a3b0: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
a3c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a3d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
a3e0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
a3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
a400: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
a410: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
a420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
a430: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
a440: 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66  Parse, r1, nPref
a450: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
a460: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
a470: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a480: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
a490: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
a4a0: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
a4b0: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
a4c0: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
a4d0: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
a4e0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
a4f0: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
a500: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
a510: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
a520: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
a530: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
a540: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
a550: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
a560: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f   {.      if( pSo
a570: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
a580: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
a590: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
a5a0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
a5b0: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
a5c0: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
a5d0: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
a5e0: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
a5f0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
a600: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
a610: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
a620: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
a630: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
a640: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
a650: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
a660: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
a670: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
a680: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20  OntoSorter(.    
a690: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
a6a0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
a6b0: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
a6c0: 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69  esultCol, nPrefi
a6d0: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
a6e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
a6f0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
a700: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a710: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a720: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a730: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29  pDest->zAffSdst)
a740: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
a750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a760: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a770: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
a780: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
a790: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
a7a0: 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  r1, pDest->zAffS
a7b0: 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  dst, nResultCol)
a7c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a7d0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
a7e0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
a7f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
a800: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
a810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a820: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
a830: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
a840: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
a850: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
a860: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
a870: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
a880: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
a890: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a8a0: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
a8b0: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
a8c0: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
a8d0: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
a8e0: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
a8f0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
a900: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
a910: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a920: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
a930: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
a940: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
a950: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
a960: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
a970: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
a980: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a990: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
a9a0: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
a9b0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
a9c0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
a9d0: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
a9e0: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
a9f0: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
aa00: 20 63 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f   cell or array o
aa10: 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79  f .    ** memory
aa20: 20 63 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b   cells and break
aa30: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e   out of the scan
aa40: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
aa50: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
aa60: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  {.      if( pSor
aa70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
aa80: 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c  ert( nResultCol<
aa90: 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b  =pDest->nSdst );
aaa0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
aab0: 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20  oSorter(.       
aac0: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f       pParse, pSo
aad0: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
aae0: 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75  , regOrig, nResu
aaf0: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
ab00: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
ab10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ab20: 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65   nResultCol==pDe
ab30: 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20  st->nSdst );.   
ab40: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
ab50: 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b  Result==iParm );
ab60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
ab70: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
ab80: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
ab90: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
aba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
abb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
abc0: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
abd0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
abe0: 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  RY */..    case 
abf0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20  SRT_Coroutine:  
ac00: 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74       /* Send dat
ac10: 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e  a to a co-routin
ac20: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52  e */.    case SR
ac30: 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20  T_Output: {     
ac40: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
ac50: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
ac60: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
ac70: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
ac80: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ac90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
aca0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
acb0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
acc0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
acd0: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
ace0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
acf0: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
ad00: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 72 65              nPre
ad20: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
ad30: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
ad40: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
ad50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ad60: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ad70: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
ad80: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
ad90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ada0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
adb0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
adc0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
add0: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
ade0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
adf0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
ae00: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
ae10: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
ae20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
ae30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
ae40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ae50: 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  CTE.    /* Write
ae60: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74   the results int
ae70: 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65  o a priority que
ae80: 75 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72  ue that is order
ae90: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20   according to.  
aea0: 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64    ** pDest->pOrd
aeb0: 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20  erBy (in pSO).  
aec0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28  pDest->iSDParm (
aed0: 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65  in iParm) is the
aee0: 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20   cursor for an. 
aef0: 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68     ** index with
af00: 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f   pSO->nExpr+2 co
af10: 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20  lumns.  Build a 
af20: 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f  key using pSO fo
af30: 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  r the first.    
af40: 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f  ** pSO->nExpr co
af50: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65  lumns, then make
af60: 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61   sure all keys a
af70: 72 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64  re unique by add
af80: 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e  ing a.    ** fin
af90: 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63  al OP_Sequence c
afa0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74  olumn.  The last
afb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72   column is the r
afc0: 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e  ecord as a blob.
afd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
afe0: 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a   SRT_DistQueue:.
aff0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65      case SRT_Que
b000: 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ue: {.      int 
b010: 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  nKey;.      int 
b020: 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20  r1, r2, r3;.    
b030: 20 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d    int addrTest =
b040: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   0;.      ExprLi
b050: 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70  st *pSO;.      p
b060: 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64  SO = pDest->pOrd
b070: 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65  erBy;.      asse
b080: 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20  rt( pSO );.     
b090: 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78   nKey = pSO->nEx
b0a0: 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  pr;.      r1 = s
b0b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
b0c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
b0d0: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
b0e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
b0f0: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
b100: 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a  r3 = r2+nKey+1;.
b110: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
b120: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
b130: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
b140: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
b150: 69 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68  is DistQueue, th
b160: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
b170: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
b180: 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f      ** on a seco
b190: 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  nd ephemeral ind
b1a0: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c  ex that holds al
b1b0: 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70  l values every p
b1c0: 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20  reviously.      
b1d0: 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68    ** added to th
b1e0: 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20  e queue. */.    
b1f0: 20 20 20 20 61 64 64 72 54 65 73 74 20 3d 20 73      addrTest = s
b200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b210: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
b220: 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20   iParm+1, 0, .  
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b250: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c        regResult,
b260: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
b270: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
b280: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
b290: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
b2b0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
b2c0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
b2d0: 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  r3);.      if( e
b2e0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
b2f0: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eue ){.        s
b300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b310: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b320: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a  , iParm+1, r3);.
b330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b340: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
b350: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
b360: 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULT);.      }.  
b370: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b380: 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Key; i++){.     
b390: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b3a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
b3b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
b3d0: 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69  esult + pSO->a[i
b3e0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
b3f0: 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20  l - 1,.         
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a   r2+i);.      }.
b420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b430: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
b440: 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72  quence, iParm, r
b450: 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73  2+nKey);.      s
b460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b470: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b480: 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72  d, r2, nKey+2, r
b490: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b4a0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
b4b0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
b4c0: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e  iParm, r1, r2, n
b4d0: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  Key+2);.      if
b4e0: 28 20 61 64 64 72 54 65 73 74 20 29 20 73 71 6c  ( addrTest ) sql
b4f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b500: 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20  (v, addrTest);. 
b510: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
b520: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
b530: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  e, r1);.      sq
b540: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b550: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32  Range(pParse, r2
b560: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
b570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
b580: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b590: 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69  MIT_CTE */....#i
b5a0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b5b0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
b5c0: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
b5d0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
b5e0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
b5f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
b600: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
b610: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
b620: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
b630: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
b640: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
b650: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
b660: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
b670: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
b680: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
b690: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
b6a0: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
b6b0: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
b6c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
b6d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
b6e0: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
b6f0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
b700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b710: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
b720: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
b730: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
b740: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
b750: 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  hed.  Except, if
b760: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
b770: 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63   sorter, in whic
b780: 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65  h case the sorte
b790: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69  r has already li
b7a0: 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f  mited.  ** the o
b7b0: 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20  utput for us..  
b7c0: 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  */.  if( pSort==
b7d0: 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29  0 && p->iLimit )
b7e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b7f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
b800: 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
b810: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
b820: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b830: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
b840: 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  locate a KeyInfo
b850: 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65   object sufficie
b860: 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  nt for an index 
b870: 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  of N key columns
b880: 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20   and.** X extra 
b890: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49  columns..*/.KeyI
b8a0: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
b8b0: 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33  nfoAlloc(sqlite3
b8c0: 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74   *db, int N, int
b8d0: 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72   X){.  int nExtr
b8e0: 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f  a = (N+X)*(sizeo
b8f0: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d  f(CollSeq*)+1) -
b900: 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a   sizeof(CollSeq*
b910: 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  );.  KeyInfo *p 
b920: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b930: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
b940: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78  f(KeyInfo) + nEx
b950: 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  tra);.  if( p ){
b960: 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
b970: 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43  er = (u8*)&p->aC
b980: 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d  oll[N+X];.    p-
b990: 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31  >nKeyField = (u1
b9a0: 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  6)N;.    p->nAll
b9b0: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b  Field = (u16)(N+
b9c0: 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  X);.    p->enc =
b9d0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
b9e0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
b9f0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d  >nRef = 1;.    m
ba00: 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20  emset(&p[1], 0, 
ba10: 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65  nExtra);.  }else
ba20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
ba30: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20  Fault(db);.  }. 
ba40: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
ba50: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
ba60: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
ba70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b  */.void sqlite3K
ba80: 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49  eyInfoUnref(KeyI
ba90: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
baa0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bab0: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
bac0: 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20   p->nRef--;.    
bad0: 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
bae0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
baf0: 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  (p->db, p);.  }.
bb00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
bb10: 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  new pointer to a
bb20: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
bb30: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
bb40: 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65  te3KeyInfoRef(Ke
bb50: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
bb60: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
bb70: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
bb80: 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20     p->nRef++;.  
bb90: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
bba0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
bbb0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
bbc0: 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79 49  n TRUE if a KeyI
bbd0: 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  nfo object can b
bbe0: 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b  e change.  The K
bbf0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  eyInfo object.**
bc00: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61   can only be cha
bc10: 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73 20  nged if this is 
bc20: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65  just a single re
bc30: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f  ference to the o
bc40: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
bc50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
bc60: 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66  d only inside of
bc70: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
bc80: 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
bc90: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
bca0: 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a  teable(KeyInfo *
bcb0: 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  p){ return p->nR
bcc0: 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20  ef==1; }.#endif 
bcd0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
bce0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
bcf0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
bd00: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
bd10: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
bd20: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
bd30: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
bd40: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
bd50: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
bd60: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
bd70: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
bd80: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
bd90: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
bda0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
bdb0: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
bdc0: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
bdd0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
bde0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
bdf0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
be00: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
be10: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
be20: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
be30: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
be40: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
be50: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
be60: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
be70: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
be80: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
be90: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
bea0: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
beb0: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
bec0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
bed0: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
bee0: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
bef0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
bf00: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
bf10: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
bf20: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
bf30: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
bf40: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
bf50: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
bf60: 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
bf70: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
bf80: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
bf90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
bfa0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bfb0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
bfc0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
bfd0: 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66   Form the KeyInf
bfe0: 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68  o object from th
bff0: 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20  is ExprList */. 
c000: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20   int iStart,    
c010: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77        /* Begin w
c020: 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ith this column 
c030: 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  of pList */.  in
c040: 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20  t nExtra        
c050: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
c060: 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  any extra column
c070: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  s to the end */.
c080: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
c090: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
c0a0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
c0b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
c0c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c0d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
c0e0: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
c0f0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
c100: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
c110: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
c120: 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e   nExpr-iStart, n
c130: 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20  Extra+1);.  if( 
c140: 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73  pInfo ){.    ass
c150: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
c160: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
c170: 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72  Info) );.    for
c180: 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d  (i=iStart, pItem
c190: 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74  =pList->a+iStart
c1a0: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
c1b0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
c1c0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
c1d0: 53 74 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33  Start] = sqlite3
c1e0: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50  ExprNNCollSeq(pP
c1f0: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
c200: 70 72 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  pr);.      pInfo
c210: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69  ->aSortOrder[i-i
c220: 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e  Start] = pItem->
c230: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
c240: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
c250: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  nfo;.}../*.** Na
c260: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
c270: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
c280: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
c290: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
c2a0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
c2b0: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
c2c0: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
c2d0: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
c2e0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
c2f0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
c300: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
c310: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
c320: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
c330: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
c340: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
c350: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
c360: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
c370: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
c380: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
c390: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
c3a0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
c3b0: 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
c3c0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c3d0: 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  N./*.** Unless a
c3e0: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
c3f0: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
c400: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
c410: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
c420: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
c430: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
c440: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
c450: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
c460: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
c470: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
c480: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
c490: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54  :.**.**   "USE T
c4a0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78  EMP B-TREE FOR x
c4b0: 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  xx".**.** where 
c4c0: 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44  xxx is one of "D
c4d0: 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52  ISTINCT", "ORDER
c4e0: 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42   BY" or "GROUP B
c4f0: 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63  Y". Exactly whic
c500: 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e  h.** is determin
c510: 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65  ed by the zUsage
c520: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
c530: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
c540: 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65  nTempTable(Parse
c550: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
c560: 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20  char *zUsage){. 
c570: 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
c580: 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22 55  n((pParse, 0, "U
c590: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
c5a0: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 29  OR %s", zUsage))
c5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
c5c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74  n expression b t
c5d0: 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65  o lvalue a. A se
c5e0: 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72  cond, no-op, ver
c5f0: 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63  sion of this mac
c600: 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65  ro.** is provide
c610: 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d  d when SQLITE_OM
c620: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65  IT_EXPLAIN is de
c630: 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f  fined. This allo
c640: 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69  ws the code.** i
c650: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
c660: 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75  ) to assign valu
c670: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20  es to structure 
c680: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
c690: 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78   that.** only ex
c6a0: 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ist if SQLITE_OM
c6b0: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f  IT_EXPLAIN is no
c6c0: 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75  t defined withou
c6d0: 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a  t polluting the.
c6e0: 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66  ** code with #if
c6f0: 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e  ndef directives.
c700: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70  .*/.# define exp
c710: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61  lainSetInteger(a
c720: 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73  , b) a = b..#els
c730: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
c740: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
c750: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
c760: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
c770: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
c780: 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a  nTempTable(y,z).
c790: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
c7a0: 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a  SetInteger(y,z).
c7b0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49  #endif.../*.** I
c7c0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
c7d0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
c7e0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
c7f0: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
c800: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
c810: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
c820: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
c830: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
c840: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
c850: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
c860: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
c870: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
c880: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
c890: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
c8a0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
c8b0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
c8c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
c8d0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
c8e0: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
c8f0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
c900: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c910: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
c920: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
c930: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
c940: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
c950: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
c960: 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
c970: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
c980: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
c990: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
c9a0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
c9b0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
c9c0: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
c9d0: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
c9e0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  re */.){.  Vdbe 
c9f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ca00: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
ca10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ca20: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ca30: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  t */.  int addrB
ca40: 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61  reak = pSort->la
ca50: 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  belDone;        
ca60: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
ca70: 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f   to exit loop */
ca80: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
ca90: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
caa0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
cab0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72  /* Jump here for
cac0: 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
cad0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70 75   /* Top of outpu
cb00: 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f 72  t loop. Jump for
cb10: 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74 20   Next. */.  int 
cb20: 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
cb30: 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72  int iTab;.  Expr
cb40: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
cb50: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
cb60: 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ;.  int eDest = 
cb70: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
cb80: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
cb90: 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e  t->iSDParm;.  in
cba0: 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20  t regRow;.  int 
cbb0: 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  regRowid;.  int 
cbc0: 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  iCol;.  int nKey
cbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cbe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cbf0: 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
cc00: 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72   in sorter recor
cc10: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  d */.  int iSort
cc20: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
cc30: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
cc40: 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20   cursor to read 
cc50: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  from */.  int i;
cc60: 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20  .  int bSeq;    
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
cc90: 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c  rter record incl
cca0: 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f  udes seq. no. */
ccb0: 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65 79 20 3d  .  int nRefKey =
ccc0: 20 30 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   0;.  struct Exp
ccd0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74  rList_item *aOut
cce0: 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Ex = p->pEList->
ccf0: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64  a;..  assert( ad
cd00: 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69  drBreak<0 );.  i
cd10: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
cd20: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  kOut ){.    sqli
cd30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cd40: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
cd50: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
cd60: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
cd70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cd80: 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61  Goto(v, addrBrea
cd90: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
cda0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
cdb0: 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  v, pSort->labelB
cdc0: 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 64  kOut);.  }..#ifd
cdd0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
cde0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
cdf0: 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 79  ES.  /* Open any
ce00: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 65 64 20   cursors needed 
ce10: 66 6f 72 20 73 6f 72 74 65 72 2d 72 65 66 65 72  for sorter-refer
ce20: 65 6e 63 65 20 65 78 70 72 65 73 73 69 6f 6e 73  ence expressions
ce30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
ce40: 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b 20  <pSort->nDefer; 
ce50: 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  i++){.    Table 
ce60: 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61  *pTab = pSort->a
ce70: 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20  Defer[i].pTab;. 
ce80: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
ce90: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
cea0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
ceb0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
cec0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
ced0: 6c 65 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  le(pParse, pSort
cee0: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72  ->aDefer[i].iCsr
cef0: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
cf00: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 6e  OpenRead);.    n
cf10: 52 65 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52 65  RefKey = MAX(nRe
cf20: 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44 65  fKey, pSort->aDe
cf30: 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20 20  fer[i].nKey);.  
cf40: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 54 61 62  }.#endif..  iTab
cf50: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
cf60: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
cf70: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
cf80: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
cf90: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
cfa0: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67  T_Mem ){.    reg
cfb0: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
cfc0: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
cfd0: 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Sdst;.  }else{. 
cfe0: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71     regRowid = sq
cff0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
d000: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67  pParse);.    reg
d010: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
d020: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
d030: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a  , nColumn);.  }.
d040: 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42    nKey = pOrderB
d050: 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74  y->nExpr - pSort
d060: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20  ->nOBSat;.  if( 
d070: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
d080: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
d090: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  orter ){.    int
d0a0: 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b   regSortOut = ++
d0b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d0c0: 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61    iSortTab = pPa
d0d0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
d0e0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
d0f0: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  lBkOut ){.      
d100: 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74  addrOnce = sqlit
d110: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
d120: 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
d130: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
d140: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d150: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
d160: 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61  nPseudo, iSortTa
d170: 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 0a  b, regSortOut, .
d180: 20 20 20 20 20 20 20 20 6e 4b 65 79 2b 31 2b 6e          nKey+1+n
d190: 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b 65 79 29 3b  Column+nRefKey);
d1a0: 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63  .    if( addrOnc
d1b0: 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  e ) sqlite3VdbeJ
d1c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
d1d0: 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  nce);.    addr =
d1e0: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
d1f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
d200: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
d210: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
d220: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d230: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
d240: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
d250: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
d260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d270: 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
d280: 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f  ata, iTab, regSo
d290: 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29  rtOut, iSortTab)
d2a0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a  ;.    bSeq = 0;.
d2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
d2c0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
d2d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d2e0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
d2f0: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
d300: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
d310: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
d320: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
d330: 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54  nue);.    iSortT
d340: 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62  ab = iTab;.    b
d350: 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66  Seq = 1;.  }.  f
d360: 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65  or(i=0, iCol=nKe
d370: 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e 43 6f 6c  y+bSeq-1; i<nCol
d380: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  umn; i++){.#ifde
d390: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d3a0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
d3b0: 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  S.    if( aOutEx
d3c0: 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29  [i].bSorterRef )
d3d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69   continue;.#endi
d3e0: 66 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  f.    if( aOutEx
d3f0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
d400: 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b  Col==0 ) iCol++;
d410: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
d420: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d430: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 69 66  _REFERENCES.  if
d440: 28 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20  ( pSort->nDefer 
d450: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b 65 79 20  ){.    int iKey 
d460: 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 69 6e  = iCol+1;.    in
d470: 74 20 72 65 67 4b 65 79 20 3d 20 73 71 6c 69 74  t regKey = sqlit
d480: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
d490: 50 61 72 73 65 2c 20 6e 52 65 66 4b 65 79 29 3b  Parse, nRefKey);
d4a0: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
d4b0: 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b 20  <pSort->nDefer; 
d4c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
d4d0: 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e 61 44  iCsr = pSort->aD
d4e0: 65 66 65 72 5b 69 5d 2e 69 43 73 72 3b 0a 20 20  efer[i].iCsr;.  
d4f0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
d500: 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  = pSort->aDefer[
d510: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  i].pTab;.      i
d520: 6e 74 20 6e 4b 65 79 20 3d 20 70 53 6f 72 74 2d  nt nKey = pSort-
d530: 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 3b  >aDefer[i].nKey;
d540: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
d550: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d560: 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a  NullRow, iCsr);.
d570: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
d580: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
d590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d5a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
d5b0: 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b  mn, iSortTab, iK
d5c0: 65 79 2b 2b 2c 20 72 65 67 4b 65 79 29 3b 0a 20  ey++, regKey);. 
d5d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d5e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
d5f0: 65 65 6b 52 6f 77 69 64 2c 20 69 43 73 72 2c 20  eekRowid, iCsr, 
d600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d610: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d620: 64 64 72 28 76 29 2b 31 2c 20 72 65 67 4b 65 79  ddr(v)+1, regKey
d630: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d640: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
d650: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 6d 70 3b         int iJmp;
d660: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d670: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
d680: 65 79 49 6e 64 65 78 28 70 54 61 62 29 2d 3e 6e  eyIndex(pTab)->n
d690: 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29 3b 0a  KeyCol==nKey );.
d6a0: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
d6b0: 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20   k<nKey; k++){. 
d6c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d6d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d6e0: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
d6f0: 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65  b, iKey++, regKe
d700: 79 2b 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  y+k);.        }.
d710: 20 20 20 20 20 20 20 20 69 4a 6d 70 20 3d 20 73          iJmp = s
d720: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d730: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
d740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d750: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65  Op4Int(v, OP_See
d760: 6b 47 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b  kGE, iCsr, iJmp+
d770: 32 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29  2, regKey, nKey)
d780: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d790: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
d7a0: 2c 20 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73 72  , OP_IdxLE, iCsr
d7b0: 2c 20 69 4a 6d 70 2b 33 2c 20 72 65 67 4b 65 79  , iJmp+3, regKey
d7c0: 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , nKey);.       
d7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d7e0: 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
d7f0: 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 7d  , iCsr);.      }
d800: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d810: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
d820: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 4b 65  ge(pParse, regKe
d830: 79 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 20 20 7d  y, nRefKey);.  }
d840: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
d850: 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d 30 3b  nColumn-1; i>=0;
d860: 20 69 2d 2d 29 7b 0a 23 69 66 64 65 66 20 53 51   i--){.#ifdef SQ
d870: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
d880: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
d890: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
d8a0: 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  bSorterRef ){.  
d8b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d8c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4f 75 74  ode(pParse, aOut
d8d0: 45 78 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65 67  Ex[i].pExpr, reg
d8e0: 52 6f 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  Row+i);.    }els
d8f0: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
d900: 20 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a       int iRead;.
d910: 20 20 20 20 20 20 69 66 28 20 61 4f 75 74 45 78        if( aOutEx
d920: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
d930: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Col ){.        i
d940: 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b 69 5d  Read = aOutEx[i]
d950: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
d960: 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
d970: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d980: 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 7d   iCol--;.      }
d990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d9a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d9b0: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
d9c0: 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b 69   iRead, regRow+i
d9d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d9e0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61  ment((v, "%s", a
d9f0: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 3f 61  OutEx[i].zName?a
da00: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a  OutEx[i].zName :
da10: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e   aOutEx[i].zSpan
da20: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
da30: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
da40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
da50: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
da60: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
da70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
da90: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67  owid, iParm, reg
daa0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
dab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
dac0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
dad0: 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67  arm, regRow, reg
dae0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
daf0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
db00: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
db10: 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ND);.      break
db20: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
db30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
db40: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
db50: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
db60: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
db70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
db80: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29  pDest->zAffSdst)
db90: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
dba0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
dbb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
dbc0: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  gRow, nColumn, r
dbd0: 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20  egRowid,.       
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
dc00: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
dc10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
dc20: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
dc30: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
dc40: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
dc50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc60: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
dc70: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
dc80: 67 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20  gRowid, regRow, 
dc90: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
dcb0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
dcc0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
dcd0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
dce0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
dcf0: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
dd00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dd10: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
dd20: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
dd30: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  rt( eDest==SRT_O
dd40: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
dd50: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
dd60: 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65   .      testcase
dd70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
dd80: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  put );.      tes
dd90: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
dda0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
ddb0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
ddc0: 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
ddd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dde0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
ddf0: 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e  sultRow, pDest->
de00: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
de10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
de20: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
de30: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
de40: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
de50: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65  olumn);.      }e
de60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
de70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
de80: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
de90: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
dea0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
deb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
dec0: 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20  ( regRowid ){.  
ded0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
dee0: 5f 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71  _Set ){.      sq
def0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
df00: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
df10: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
df20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
df30: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
df40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
df50: 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20  egRow);.    }.  
df60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
df70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
df80: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  regRowid);.  }. 
df90: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
dfa0: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
dfb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
dfc0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
dfd0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
dfe0: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
dff0: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
e000: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73  eSorter ){.    s
e010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e020: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
e030: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
e040: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e050: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
e060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e070: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
e080: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
e090: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
e0a0: 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  if( pSort->regRe
e0b0: 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64  turn ) sqlite3Vd
e0c0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
e0d0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65  eturn, pSort->re
e0e0: 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69  gReturn);.  sqli
e0f0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
e100: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
e110: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
e120: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
e130: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
e140: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
e150: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
e160: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
e170: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
e180: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
e190: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
e1a0: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
e1b0: 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69  Also try to esti
e1c0: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
e1d0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
e1e0: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  lue and return t
e1f0: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
e200: 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a   *pEstWidth..**.
e210: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
e220: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
e230: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
e240: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
e250: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
e260: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
e270: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
e280: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e290: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
e2a0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
e2b0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
e2c0: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
e2d0: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
e2e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
e2f0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
e300: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
e310: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
e320: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
e330: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
e340: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
e350: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
e360: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
e370: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
e380: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
e390: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
e3a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
e3b0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
e3c0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
e3d0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
e3e0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
e3f0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
e400: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
e410: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
e420: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
e430: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
e440: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
e450: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
e460: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
e470: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
e480: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  mn is NULL..**.*
e490: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
e4a0: 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36  as either 3 or 6
e4b0: 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65   parameters depe
e4c0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
e4d0: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53   or not.** the S
e4e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e4f0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d  UMN_METADATA com
e500: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
e510: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66   is used..*/.#if
e520: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e530: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e540: 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  A.# define colum
e550: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29  nType(A,B,C,D,E)
e560: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
e570: 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65 6c 73 65  A,B,C,D,E).#else
e580: 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28   /* if !defined(
e590: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e5a0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a  LUMN_METADATA) *
e5b0: 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  /.# define colum
e5c0: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29  nType(A,B,C,D,E)
e5d0: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
e5e0: 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  A,B).#endif.stat
e5f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
e600: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
e610: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
e620: 43 2c 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  C, .#ifndef SQLI
e630: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e640: 5f 4d 45 54 41 44 41 54 41 0a 20 20 45 78 70 72  _METADATA.  Expr
e650: 20 2a 70 45 78 70 72 0a 23 65 6c 73 65 0a 20 20   *pExpr.#else.  
e660: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63  Expr *pExpr,.  c
e670: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
e680: 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  igDb,.  const ch
e690: 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a  ar **pzOrigTab,.
e6a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
e6b0: 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64 69 66 0a  zOrigCol.#endif.
e6c0: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
e6d0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
e6e0: 74 20 6a 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  t j;.#ifdef SQLI
e6f0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e700: 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72  _METADATA.  char
e710: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20   const *zOrigDb 
e720: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
e730: 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  t *zOrigTab = 0;
e740: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
e750: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e  OrigCol = 0;.#en
e760: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
e770: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  Expr!=0 );.  ass
e780: 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
e790: 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
e7a0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
e7b0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
e7c0: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
e7d0: 72 75 6e 65 73 20 62 65 66 6f 72 65 20 61 67 67  runes before agg
e7e0: 72 65 67 61 74 65 73 0a 20 20 20 20 20 20 20 20  regates.        
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
e810: 2a 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  * are processed 
e820: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  */.  switch( pEx
e830: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
e840: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
e850: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
e860: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
e870: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
e880: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
e890: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
e8a0: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
e8b0: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
e8c0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
e8d0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
e8e0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
e8f0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
e900: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
e910: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
e920: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
e930: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
e940: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
e950: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e960: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
e970: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
e980: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
e990: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
e9a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
e9b0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e9c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
e9d0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
e9e0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
e9f0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
ea00: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
ea10: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
ea20: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
ea30: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
ea40: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
ea50: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
ea60: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
ea70: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
ea80: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
ea90: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
eaa0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
eab0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
eac0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
ead0: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
eae0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
eaf0: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
eb00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
eb10: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
eb20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
eb30: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
eb40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
eb50: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
eb60: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
eb70: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
eb80: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
eb90: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
eba0: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
ebb0: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
ebc0: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
ebd0: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
ebe0: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
ebf0: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
ec00: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
ec10: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
ec20: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
ec30: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
ec40: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
ec50: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
ec60: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
ec70: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
ec80: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
ec90: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
eca0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ecb0: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
ecc0: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
ecd0: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
ece0: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
ecf0: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
ed00: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
ed10: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
ed20: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
ed30: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
ed40: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
ed50: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
ed60: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
ed70: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
ed80: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
ed90: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
eda0: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
edb0: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
edc0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
edd0: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
ede0: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
edf0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
ee00: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
ee10: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
ee20: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
ee30: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
ee40: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
ee50: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
ee60: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
ee70: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
ee80: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
ee90: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
eea0: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
eeb0: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
eec0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
eed0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
eee0: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
eef0: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
ef00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
ef10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
ef20: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
ef30: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
ef40: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
ef50: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
ef60: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
ef70: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ef80: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
ef90: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
efa0: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
efb0: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
efc0: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
efd0: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
efe0: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
eff0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
f000: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
f010: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
f020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
f030: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
f040: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
f050: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
f060: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
f070: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
f080: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
f090: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
f0a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
f0b0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
f0c0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
f0d0: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
f0e0: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
f0f0: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
f100: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
f110: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
f120: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
f130: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
f140: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
f150: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
f160: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
f170: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
f180: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
f190: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
f1a0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
f1b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
f1c0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f1d0: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
f1e0: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
f1f0: 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20  gCol); .        
f200: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
f210: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
f220: 20 74 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20   table or a CTE 
f230: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
f240: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
f250: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f260: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
f270: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
f280: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
f290: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
f2a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
f2b0: 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  ol==XN_ROWID || 
f2c0: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
f2d0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
f2e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
f2f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
f300: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
f310: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
f320: 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  igCol = "rowid";
f330: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f340: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
f350: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
f360: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
f370: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f380: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f390: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f3a0: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f3b0: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61  .        zOrigTa
f3c0: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
f3d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
f3e0: 2d 3e 70 50 61 72 73 65 20 26 26 20 70 54 61 62  ->pParse && pTab
f3f0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
f400: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
f410: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f420: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
f430: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
f440: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
f450: 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e   zOrigDb = pNC->
f460: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
f470: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
f480: 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20         }.#else. 
f490: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
f4a0: 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c  Col==XN_ROWID ||
f4b0: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
f4c0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
f4d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
f4e0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
f4f0: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
f500: 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  R";.        }els
f510: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
f520: 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  pe = sqlite3Colu
f530: 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43  mnType(&pTab->aC
f540: 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20  ol[iCol],0);.   
f550: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
f560: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f570: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
f580: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f590: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
f5a0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
f5b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
f5c0: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
f5d0: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
f5e0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
f5f0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
f600: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
f610: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
f620: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f630: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
f640: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
f650: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
f660: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
f670: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
f680: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
f690: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
f6a0: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
f6b0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
f6c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
f6d0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f6e0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
f6f0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
f700: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
f710: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
f720: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
f730: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f740: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f750: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
f760: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
f770: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
f780: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20  ab, &zOrigCol); 
f790: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f7a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
f7b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f7c0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
f7d0: 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f  DATA  .  if( pzO
f7e0: 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73  rigDb ){.    ass
f7f0: 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26  ert( pzOrigTab &
f800: 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20  & pzOrigCol );. 
f810: 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a     *pzOrigDb = z
f820: 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  OrigDb;.    *pzO
f830: 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61  rigTab = zOrigTa
f840: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f  b;.    *pzOrigCo
f850: 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20  l = zOrigCol;.  
f860: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
f870: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
f880: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f890: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
f8a0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
f8b0: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
f8c0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
f8d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
f8e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
f8f0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
f900: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
f910: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
f920: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
f930: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
f940: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
f950: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
f960: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
f970: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
f980: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
f990: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
f9a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f9b0: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
f9c0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
f9d0: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
f9e0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
f9f0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
fa00: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
fa10: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
fa20: 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20  ;.  sNC.pNext = 
fa30: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
fa40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
fa50: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
fa60: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
fa70: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
fa80: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
fa90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
faa0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
fab0: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
fac0: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
fad0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fae0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
faf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
fb00: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
fb10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fb20: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
fb30: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
fb40: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20   &zOrigCol);..  
fb50: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
fb60: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
fb70: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
fb80: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
fb90: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
fba0: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
fbb0: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
fbc0: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
fbd0: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
fbe0: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
fbf0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
fc00: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
fc10: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
fc20: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
fc30: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
fc40: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fc50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fc60: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
fc70: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
fc80: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
fc90: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
fca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fcb0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fcc0: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
fcd0: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
fce0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
fcf0: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
fd00: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
fd10: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
fd20: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
fd30: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
fd40: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
fd50: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
fd60: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
fd70: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
fd80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fd90: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
fda0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
fdb0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
fdc0: 73 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  s for a SELECT s
fdd0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
fde0: 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74  The only guarant
fdf0: 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d  ee that SQLite m
fe00: 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  akes about colum
fe10: 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20  n names is that 
fe20: 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  if the.** column
fe30: 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73   has an AS claus
fe40: 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  e assigning it a
fe50: 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c   name, that will
fe60: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65   be the name use
fe70: 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68  d..** That is th
fe80: 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65  e only documente
fe90: 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f  d guarantee.  Ho
fea0: 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73  wever, countless
feb0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a   applications.**
fec0: 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20   developed over 
fed0: 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20 6d  the years have m
fee0: 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73 73  ade baseless ass
fef0: 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63  umptions about c
ff00: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61  olumn names.** a
ff10: 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66  nd will break if
ff20: 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f   those assumptio
ff30: 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e  ns changes.  Hen
ff40: 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20  ce, use extreme 
ff50: 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20  caution.** when 
ff60: 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20 72  modifying this r
ff70: 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20  outine to avoid 
ff80: 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e  breaking legacy.
ff90: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a  .**.** See Also:
ffa0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
ffb0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  romExprList().**
ffc0: 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73  .** The PRAGMA s
ffd0: 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  hort_column_name
ffe0: 73 20 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c  s and PRAGMA ful
fff0: 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73  l_column_names s
10000 65 74 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64  ettings are.** d
10010 65 70 72 65 63 61 74 65 64 2e 20 20 54 68 65 20  eprecated.  The 
10020 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20  default setting 
10030 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c  is short=ON, ful
10040 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66  l=OFF.  99.9% of
10050 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74   all.** applicat
10060 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72  ions should oper
10070 61 74 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e  ate this way.  N
10080 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
10090 6e 65 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  need to support 
100a0 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64  the.** other mod
100b0 65 73 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a  es for legacy:.*
100c0 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46  *.**    short=OF
100d0 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  F, full=OFF:    
100e0 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73    Column name is
100f0 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
10100 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
10110 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  it.**           
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70     originally ap
10140 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c  pears in the SEL
10150 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
10160 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  In.**           
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20     other words, 
10190 74 68 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65  the zSpan of the
101a0 20 72 65 73 75 6c 74 20 65 78 70 72 65 73 73 69   result expressi
101b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f  on..**.**    sho
101c0 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a  rt=ON, full=OFF:
101d0 20 20 20 20 20 20 20 28 54 68 69 73 20 69 73 20         (This is 
101e0 74 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  the default sett
101f0 69 6e 67 29 2e 20 20 49 66 20 74 68 65 20 72 65  ing).  If the re
10200 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  sult.**         
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 20 20 20 20 72 65 66 65 72 73 20 64 69 72 65       refers dire
10230 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20  ctly to a table 
10240 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
10250 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
10280 61 6d 65 20 69 73 20 6a 75 73 74 20 74 68 65 20  ame is just the 
10290 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
102c0 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  e: COLUMN.  Othe
102d0 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
102e0 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f  .**.**    full=O
102f0 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20  N, short=ANY:   
10300 20 20 20 20 49 66 20 74 68 65 20 72 65 73 75 6c      If the resul
10310 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
10320 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c  y to a table col
10330 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  umn,.**         
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 72 65       then the re
10360 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
10370 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
10380 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  name.**         
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 20 20 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a       prefix, ex:
103b0 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20   TABLE.COLUMN.  
103c0 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53  Otherwise use zS
103d0 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pan..*/.static v
103e0 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
103f0 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
10400 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
10410 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
10420 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
10430 65 6c 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e  elect     /* Gen
10440 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  erate column nam
10450 65 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  es for this SELE
10460 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
10470 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
10480 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
10490 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a  int i;.  Table *
104a0 70 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  pTab;.  SrcList 
104b0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
104c0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
104d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
104e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
104f0 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a   fullName;    /*
10500 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66   TABLE.COLUMN if
10510 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e   no AS clause an
10520 64 20 69 73 20 61 20 64 69 72 65 63 74 20 74 61  d is a direct ta
10530 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74  ble ref */.  int
10540 20 73 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a   srcName;     /*
10550 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45   COLUMN or TABLE
10560 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
10570 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64   clause and is d
10580 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65  irect */..#ifnde
10590 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
105a0 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
105b0 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
105c0 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
105d0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
105e0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
105f0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
10600 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73  dif..  if( pPars
10610 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 29  e->colNamesSet )
10620 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f   return;.  /* Co
10630 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64  lumn names are d
10640 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
10650 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
10660 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
10670 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28  lect */.  while(
10680 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
10690 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
106a0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
106b0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
106c0 61 72 73 65 2c 70 53 65 6c 65 63 74 2c 28 22 67  arse,pSelect,("g
106d0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c 75 6d 6e  enerating column
106e0 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a 20 20 70   names\n"));.  p
106f0 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  TabList = pSelec
10700 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  t->pSrc;.  pELis
10710 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
10720 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76  ist;.  assert( v
10730 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10740 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a   pTabList!=0 );.
10750 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
10760 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
10770 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61  lName = (db->fla
10780 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
10790 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
107a0 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  srcName = (db->f
107b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
107c0 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20  ortColNames)!=0 
107d0 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73  || fullName;.  s
107e0 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
107f0 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
10800 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
10810 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
10820 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
10830 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
10840 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20  a[i].pExpr;..   
10850 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
10860 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10870 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
10880 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f  N );  /* Agg pro
10890 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20  cessing has not 
108a0 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61  run yet */.    a
108b0 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
108c0 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54  _COLUMN || p->pT
108d0 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65  ab!=0 ); /* Cove
108e0 72 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65 74  ring idx not yet
108f0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69 66   coded */.    if
10900 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
10910 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Name ){.      /*
10920 20 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61 6c   An AS clause al
10930 77 61 79 73 20 74 61 6b 65 73 20 66 69 72 73 74  ways takes first
10940 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20 20   priority */.   
10950 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
10960 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
10970 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
10980 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10990 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
109a0 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
109b0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
109c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72 63     }else if( src
109d0 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d 54  Name && p->op==T
109e0 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
109f0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
10a00 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
10a10 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
10a20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b   pTab = p->pTab;
10a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10a40 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
10a50 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
10a60 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
10a70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
10a80 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
10a90 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
10aa0 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
10ab0 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
10ac0 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
10ad0 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
10ae0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
10af0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
10b00 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
10b10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c   }.      if( ful
10b20 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  lName ){.       
10b30 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
10b40 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
10b50 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10b60 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  (db, "%s.%s", pT
10b70 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
10b80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10b90 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
10ba0 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
10bb0 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
10bc0 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
10bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10be0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
10bf0 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
10c00 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
10c10 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
10c20 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
10c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
10c40 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c  st char *z = pEL
10c50 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
10c60 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20  .      z = z==0 
10c70 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  ? sqlite3MPrintf
10c80 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  (db, "column%d",
10c90 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44   i+1) : sqlite3D
10ca0 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a  bStrDup(db, z);.
10cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10cc0 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
10cd0 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
10ce0 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  z, SQLITE_DYNAMI
10cf0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
10d00 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
10d10 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
10d20 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
10d30 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
10d40 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
10d50 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
10d60 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
10d70 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
10d80 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
10d90 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
10da0 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
10db0 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
10dc0 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
10dd0 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
10de0 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
10df0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
10e00 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
10e10 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
10e20 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
10e30 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
10e40 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
10e50 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
10e60 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
10e70 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
10e80 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
10e90 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
10ea0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
10eb0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
10ec0 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
10ed0 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
10ee0 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
10ef0 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
10f00 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
10f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10f20 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  EM..**.** The on
10f30 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
10f40 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
10f50 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
10f60 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
10f70 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
10f80 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
10f90 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
10fa0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
10fb0 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
10fc0 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
10fd0 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
10fe0 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
10ff0 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
11000 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
11010 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
11020 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
11030 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
11040 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
11050 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
11060 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
11070 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
11080 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
11090 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
110a0 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
110b0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
110c0 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
110d0 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
110e0 20 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72   See Also: gener
110f0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  ateColumnNames()
11100 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
11110 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
11120 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
11130 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
11140 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
11150 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11160 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
11170 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
11180 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
11190 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
111a0 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
111b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
111c0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
111d0 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
111e0 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
111f0 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
11200 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
11210 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
11220 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
11230 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
11240 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
11250 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
11260 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
11270 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11280 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
11290 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  32 cnt;         
112a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
112b0 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
112c0 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
112d0 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
112e0 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
112f0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
11300 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
11310 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
11320 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
11330 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11340 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
11350 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
11360 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11380 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
11390 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
113b0 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69  * Size of name i
113c0 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48  n zName[] */.  H
113d0 61 73 68 20 68 74 3b 20 20 20 20 20 20 20 20 20  ash ht;         
113e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
113f0 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75  sh table of colu
11400 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73  mn names */..  s
11410 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
11420 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ht);.  if( pELis
11430 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
11440 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
11450 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
11460 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
11470 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
11480 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
11490 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
114a0 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33  ;.    if( nCol>3
114b0 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32  2767 ) nCol = 32
114c0 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  767;.  }else{.  
114d0 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
114e0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
114f0 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69  assert( nCol==(i
11500 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e  16)nCol );.  *pn
11510 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
11520 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
11530 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
11540 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64  ol; i<nCol && !d
11550 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
11560 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
11570 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
11580 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
11590 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
115a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   */.    if( (zNa
115b0 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
115c0 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
115d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
115e0 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
115f0 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
11600 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
11610 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
11620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11630 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
11640 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
11650 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
11660 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
11670 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
11680 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
11690 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
116a0 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
116b0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
116c0 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
116d0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
116e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
116f0 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  lExpr->op!=TK_AG
11700 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
11710 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
11720 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
11730 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
11740 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
11750 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
11760 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
11770 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
11780 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
11790 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
117a0 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
117b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
117c0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
117d0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
117e0 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
117f0 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
11800 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
11810 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
11820 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
11830 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11840 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11850 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
11860 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11870 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
11880 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
11890 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
118a0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
118b0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
118c0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
118d0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
118e0 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
118f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
11900 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
11910 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
11920 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
11930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11940 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
11950 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
11960 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11970 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
11980 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
11990 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
119a0 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
119b0 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
119c0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
119d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
119e0 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
119f0 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
11a00 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
11a10 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
11a20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
11a30 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
11a40 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
11a50 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11a60 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11a70 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
11a80 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
11a90 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
11aa0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
11ab0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
11ac0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
11ad0 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11ae0 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11af0 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
11b00 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
11b10 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
11b20 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
11b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
11b40 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
11b50 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
11b60 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11b70 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11b80 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11b90 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11ba0 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
11bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
11bc0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
11bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
11be0 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
11bf0 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
11c00 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
11c10 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
11c20 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
11c30 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
11c40 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
11c50 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
11c60 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
11c70 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
11c80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11c90 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
11ca0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
11cb0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11cc0 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
11cd0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
11ce0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11cf0 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
11d00 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
11d10 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
11d20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
11d30 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
11d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11d50 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
11d60 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
11d70 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
11d80 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
11d90 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
11da0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
11db0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11dc0 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
11dd0 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
11de0 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
11df0 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
11e00 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
11e10 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
11e20 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
11e30 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
11e40 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
11e50 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
11e60 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
11e70 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
11e80 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
11e90 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
11ea0 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
11eb0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
11ec0 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
11ed0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
11ee0 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11ef0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
11f00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11f10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11f20 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
11f30 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
11f40 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
11f50 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
11f60 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
11f70 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11f80 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
11f90 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
11fa0 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
11fb0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
11fc0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11fd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11fe0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
11ff0 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
12000 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
12010 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
12020 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
12030 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
12040 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
12050 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
12060 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
12070 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
12080 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
12090 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
120a0 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
120b0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
120c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
120d0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
120e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
120f0 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
12100 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
12110 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
12120 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
12130 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
12140 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
12150 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
12160 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
12170 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
12180 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
12190 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
121a0 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
121b0 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
121c0 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
121d0 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
121e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
121f0 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
12200 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
12210 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
12220 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
12230 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
12240 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
12250 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
12260 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
12270 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
12280 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
12290 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
122a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
122b0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
122c0 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
122d0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
122e0 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
122f0 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
12300 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
12310 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
12320 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
12330 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
12340 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
12350 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
12360 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
12370 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
12380 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
12390 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
123a0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
123b0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
123c0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
123d0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
123e0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
123f0 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
12400 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
12410 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
12420 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
12430 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
12440 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
12450 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
12460 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
12470 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
12480 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
12490 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
124a0 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
124b0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
124c0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
124d0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
124e0 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
124f0 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
12500 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12510 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
12520 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
12530 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
12540 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
12550 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12560 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
12570 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
12580 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
12590 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
125a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
125b0 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
125c0 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
125d0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
125e0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
125f0 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
12600 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
12610 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
12620 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
12630 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
12640 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
12650 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
12660 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
12670 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
12680 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
12690 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
126a0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
126b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
126c0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
126d0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
126e0 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
126f0 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
12700 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
12710 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
12720 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
12730 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
12740 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62  isable );.  pTab
12750 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
12760 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
12770 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
12780 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
12790 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
127a0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
127b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  );.  sqlite3Colu
127c0 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
127d0 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
127e0 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
127f0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
12800 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  l);.  sqlite3Sel
12810 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
12820 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
12830 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
12840 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
12850 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
12860 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12870 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12880 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
12890 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
128a0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
128b0 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
128c0 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
128d0 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
128e0 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
128f0 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
12900 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
12910 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
12920 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
12930 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
12940 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
12950 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
12960 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
12970 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
12980 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74  pVdbe ){.    ret
12990 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62  urn pParse->pVdb
129a0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
129b0 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
129c0 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
129d0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
129e0 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
129f0 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
12a00 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  ){.    pParse->o
12a10 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
12a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
12a30 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
12a40 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a  (pParse);.}.../*
12a50 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
12a60 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12a70 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
12a80 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
12a90 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 65   the.** pLimit e
12aa0 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
12ab0 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
12ac0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 68 6f  Limit->pRight ho
12ad0 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
12ae0 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
12af0 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
12b00 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
12b10 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
12b20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
12b30 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
12b40 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
12b50 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
12b60 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12b70 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
12b80 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
12b90 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
12ba0 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
12bb0 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
12bc0 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
12bd0 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
12be0 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
12bf0 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
12c00 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
12c10 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
12c20 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
12c30 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
12c40 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
12c50 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
12c60 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
12c70 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
12c80 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
12c90 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c  it->pLeft and pL
12ca0 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20 20 69  imit->pRight.  i
12cb0 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69 4f 66  Limit.** and iOf
12cc0 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
12cd0 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
12ce0 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
12cf0 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f  ult values (zero
12d00 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
12d10 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
12d20 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f  ne..**.** The iO
12d30 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28  ffset register (
12d40 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
12d50 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
12d60 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
12d70 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65  the OFFSET.  The
12d80 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72   iLimit register
12d90 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12da0 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73  to LIMIT.  Regis
12db0 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31  ter.** iOffset+1
12dc0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12dd0 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e  to LIMIT+OFFSET.
12de0 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  .**.** Only if p
12df0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20  Limit->pLeft!=0 
12e00 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
12e10 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
12e20 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
12e30 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
12e40 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
12e50 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
12e60 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
12e70 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
12e80 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
12e90 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
12ea0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
12eb0 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
12ec0 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
12ed0 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
12ee0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
12ef0 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
12f00 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
12f10 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
12f20 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
12f30 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 45 78  t;.  int n;.  Ex
12f40 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
12f50 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28 20 70  pLimit;..  if( p
12f60 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
12f70 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
12f80 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
12f90 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
12fa0 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
12fb0 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
12fc0 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
12fd0 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
12fe0 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
12ff0 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
13000 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
13010 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
13020 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
13030 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
13040 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
13050 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ear(pParse);.  i
13060 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( pLimit ){.   
13070 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d   assert( pLimit-
13080 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20 29 3b  >op==TK_LIMIT );
13090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
130a0 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b  mit->pLeft!=0 );
130b0 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
130c0 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
130d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
130e0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
130f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
13100 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
13110 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13120 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69 6d 69  rIsInteger(pLimi
13130 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20 29 7b  t->pLeft, &n) ){
13140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13150 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13160 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
13170 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
13180 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
13190 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
131a0 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
131b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
131c0 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b  beGoto(v, iBreak
131d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
131e0 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
131f0 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33  electRow>sqlite3
13200 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29  LogEst((u64)n) )
13210 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
13220 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
13230 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b  3LogEst((u64)n);
13240 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
13250 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64  lags |= SF_Fixed
13260 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
13270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13280 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13290 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
132a0 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  pLeft, iLimit);.
132b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
132c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
132d0 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
132e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
132f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13300 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
13310 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
13320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13330 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
13340 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
13350 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13370 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
13380 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
13390 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
133a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
133b0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
133c0 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
133d0 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
133e0 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
133f0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
13400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13410 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
13420 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65 74 29  pRight, iOffset)
13430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13440 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13450 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
13460 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
13470 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
13480 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
13490 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
134a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
134b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
134c0 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
134d0 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
134e0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
134f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13500 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
13510 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
13520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13530 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13540 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13550 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
13560 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13570 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
13580 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
13590 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
135a0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
135b0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
135c0 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
135d0 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
135e0 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
135f0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
13600 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
13610 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
13620 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
13630 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
13640 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
13650 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
13660 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
13670 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
13680 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
13690 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
136a0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
136b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
136c0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
136d0 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
136e0 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
136f0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
13700 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
13710 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
13720 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
13730 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13740 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
13750 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
13760 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
13770 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
13780 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
13790 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
137a0 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
137b0 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
137c0 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
137d0 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
137e0 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
137f0 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
13800 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
13810 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
13820 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
13830 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
13840 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
13850 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
13860 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
13870 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
13880 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
13890 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
138a0 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
138b0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
138c0 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
138d0 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
138e0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
138f0 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
13900 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
13910 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
13920 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
13930 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
13940 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
13950 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
13960 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
13970 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
13980 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
13990 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
139a0 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
139b0 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
139c0 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
139d0 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
139e0 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
139f0 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
13a00 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
13a10 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
13a20 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
13a30 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
13a40 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
13a50 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
13a60 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
13a70 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
13a80 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
13a90 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
13aa0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13ab0 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
13ac0 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
13ad0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
13ae0 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
13af0 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
13b00 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
13b10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13b20 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
13b30 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
13b40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13b50 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
13b60 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
13b70 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
13b80 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
13b90 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
13ba0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
13bb0 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
13bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
13bd0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13be0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13bf0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
13c00 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
13c10 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
13c20 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13c30 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
13c40 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
13c50 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
13c60 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
13c70 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
13c80 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
13c90 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
13ca0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
13cb0 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
13cc0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
13cd0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
13ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
13cf0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
13d00 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
13d10 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
13d20 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
13d30 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
13d40 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
13d50 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13d60 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
13d70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
13d80 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
13d90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
13da0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13db0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
13dc0 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
13dd0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
13de0 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
13df0 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
13e00 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
13e10 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
13e20 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
13e30 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
13e40 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
13e50 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
13e70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
13e80 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
13e90 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
13ee0 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
13ef0 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
13f00 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
13f10 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
13f20 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
13f30 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
13f40 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
13f50 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
13f60 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
13f70 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
13f80 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
13f90 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
13fa0 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
13fb0 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
13fc0 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
13fd0 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
13fe0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
13ff0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
14000 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
14010 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
14020 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
14030 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
14040 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
14050 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
14060 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
14070 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
14080 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
14090 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
140a0 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
140b0 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
140c0 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
140d0 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
140e0 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
140f0 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
14100 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
14110 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
14120 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
14130 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
14140 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
14150 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
14160 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
14170 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
14180 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
14190 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
141a0 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
141b0 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
141c0 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
141d0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
141e0 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
141f0 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
14200 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
14210 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
14220 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
14230 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
14240 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
14250 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
14260 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
14270 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
14280 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
14290 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
142a0 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
142b0 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
142c0 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
142d0 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
142e0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
142f0 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
14300 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
14310 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
14320 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
14330 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
14340 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
14350 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
14360 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
14370 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
14380 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
14390 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
143a0 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
143b0 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
143c0 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
143d0 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
143e0 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
143f0 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
14400 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
14410 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
14420 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
14430 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
14440 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
14450 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
14460 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
14470 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
14480 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
14490 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
144a0 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
144b0 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
144c0 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
144d0 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
144e0 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
144f0 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
14500 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
14510 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
14520 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
14530 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
14540 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
14550 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
14560 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
14570 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
14580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14590 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
145a0 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
145b0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
145c0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
145d0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
145e0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
145f0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
14600 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
14610 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
14620 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
14630 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
14640 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
14650 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
14660 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
14670 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
14680 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
14690 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
146a0 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
146b0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
146c0 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
146d0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
146e0 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
146f0 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
14700 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
14710 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
14740 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
14750 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
14760 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
14770 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
14780 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
14790 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
147a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
147b0 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
147c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
147d0 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
147e0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
147f0 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
14800 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
14810 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
14820 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
14830 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
14840 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
14850 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
14860 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
14870 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
14880 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
14890 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
148a0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
148b0 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
148c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
148d0 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
148e0 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
148f0 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
14900 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
14910 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14930 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
14940 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
14970 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
14980 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
14990 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
149a0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
149b0 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149d0 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
149e0 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
149f0 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
14a00 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
14a10 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
14a20 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
14a30 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
14a40 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
14a50 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
14a60 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
14a70 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14a80 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
14a90 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
14aa0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
14ab0 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
14ac0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
14ad0 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
14ae0 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
14af0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
14b00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14b10 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
14b20 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69   = 320;  /* 4 bi
14b30 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20  llion rows */.  
14b40 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14b50 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14b60 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
14b70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
14b80 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
14b90 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
14ba0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
14bb0 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
14bc0 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69   = 0;.  p->iLimi
14bd0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  t = p->iOffset =
14be0 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   0;.  pOrderBy =
14bf0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
14c00 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
14c10 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
14c20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  the Current tabl
14c30 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
14c40 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e  ALWAYS(i<pSrc->n
14c50 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Src); i++){.    
14c60 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66  if( pSrc->a[i].f
14c70 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  g.isRecursive ){
14c80 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20  .      iCurrent 
14c90 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  = pSrc->a[i].iCu
14ca0 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61  rsor;.      brea
14cb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
14cc0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
14cd0 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ors numbers for 
14ce0 51 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e  Queue and Distin
14cf0 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  ct.  The cursor 
14d00 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20  number for.  ** 
14d10 74 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62  the Distinct tab
14d20 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  le must be exact
14d30 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74  ly one greater t
14d40 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64  han Queue in ord
14d50 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
14d60 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64  SRT_DistFifo and
14d70 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64   SRT_DistQueue d
14d80 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77  estinations to w
14d90 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65  ork. */.  iQueue
14da0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14db0 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  +;.  if( p->op==
14dc0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
14dd0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
14de0 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65   ? SRT_DistQueue
14df0 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b   : SRT_DistFifo;
14e00 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d  .    iDistinct =
14e10 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44  .  }else{.    eD
14e30 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
14e40 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54   SRT_Queue : SRT
14e50 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c  _Fifo;.  }.  sql
14e60 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14e70 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65  it(&destQueue, e
14e80 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a  Dest, iQueue);..
14e90 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
14ea0 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e  rsors for Curren
14eb0 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69  t, Queue, and Di
14ec0 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67  stinct. */.  reg
14ed0 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72  Current = ++pPar
14ee0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
14ef0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14f00 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
14f10 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72  iCurrent, regCur
14f20 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69  rent, nCol);.  i
14f30 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
14f40 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
14f50 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Info = multiSele
14f60 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
14f70 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
14f80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14f90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
14fa0 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
14fb0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
14fc0 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14fe0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
14ff0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
15000 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65   destQueue.pOrde
15010 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
15020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
15030 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15040 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
15050 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c  al, iQueue, nCol
15060 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d  );.  }.  VdbeCom
15070 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20  ment((v, "Queue 
15080 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20  table"));.  if( 
15090 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  iDistinct ){.   
150a0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
150b0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [0] = sqlite3Vdb
150c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
150d0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69  enEphemeral, iDi
150e0 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20  stinct, 0);.    
150f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
15100 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
15110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63  .  }..  /* Detac
15120 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
15130 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63  lause from the c
15140 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
15150 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
15160 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65  = 0;..  /* Store
15170 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
15180 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  the setup-query 
15190 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70  in Queue. */.  p
151a0 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30  Setup->pNext = 0
151b0 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
151c0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
151d0 20 22 53 45 54 55 50 22 29 29 3b 0a 20 20 72 63   "SETUP"));.  rc
151e0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
151f0 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c  (pParse, pSetup,
15200 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
15210 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
15220 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  p;.  if( rc ) go
15230 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  to end_of_recurs
15240 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a  ive_query;..  /*
15250 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72   Find the next r
15260 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  ow in the Queue 
15270 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20  and output that 
15280 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  row */.  addrTop
15290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
152a0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
152b0 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42  d, iQueue, addrB
152c0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
152d0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72  age(v);..  /* Tr
152e0 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20  ansfer the next 
152f0 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65  row in Queue ove
15300 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a  r to Current */.
15310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15320 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
15330 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a  w, iCurrent); /*
15340 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e   To reset column
15350 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20   cache */.  if( 
15360 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
15370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15380 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
15390 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
153a0 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75  ->nExpr+1, regCu
153b0 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  rrent);.  }else{
153c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
153d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
153e0 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65  Data, iQueue, re
153f0 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  gCurrent);.  }. 
15400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15410 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
15420 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
15430 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c  Output the singl
15440 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
15450 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d   */.  addrCont =
15460 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15470 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65  Label(v);.  code
15480 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66  Offset(v, regOff
15490 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  set, addrCont);.
154a0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
154b0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 69 43 75  p(pParse, p, iCu
154c0 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20  rrent,.      0, 
154d0 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f  0, pDest, addrCo
154e0 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  nt, addrBreak);.
154f0 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29    if( regLimit )
15500 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15510 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
15520 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c  crJumpZero, regL
15530 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29  imit, addrBreak)
15540 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
15550 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
15560 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15570 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
15580 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  );..  /* Execute
15590 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53   the recursive S
155a0 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65  ELECT taking the
155b0 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
155c0 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74  urrent as.  ** t
155d0 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
155e0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
155f0 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  . Store the resu
15600 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  lts in the Queue
15610 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15620 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
15630 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73  gregate ){.    s
15640 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15650 50 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76  Parse, "recursiv
15660 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
15670 69 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  ies not supporte
15680 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d");.  }else{.  
15690 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
156a0 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72  .    ExplainQuer
156b0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
156c0 2c 20 22 52 45 43 55 52 53 49 56 45 20 53 54 45  , "RECURSIVE STE
156d0 50 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  P"));.    sqlite
156e0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
156f0 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a  p, &destQueue);.
15700 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15710 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  Prior==0 );.    
15720 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74  p->pPrior = pSet
15730 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65  up;.  }..  /* Ke
15740 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c  ep running the l
15750 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75  oop until the Qu
15760 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  eue is empty */.
15770 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
15780 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  o(v, addrTop);. 
15790 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
157a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
157b0 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f  Break);..end_of_
157c0 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a  recursive_query:
157d0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
157e0 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
157f0 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  >db, p->pOrderBy
15800 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  );.  p->pOrderBy
15810 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
15820 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
15830 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  t;.  return;.}.#
15840 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15850 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20  OMIT_CTE */../* 
15860 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
15870 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
15880 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
15890 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
158a0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
158b0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
158c0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
158d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
158e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
158f0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
15900 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
15910 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
15920 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
15930 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
15940 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e  */.);../*.** Han
15950 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  dle the special 
15960 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75  case of a compou
15970 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
15980 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
15990 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73  .** VALUES claus
159a0 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20  e.  By handling 
159b0 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61  this as a specia
159c0 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64  l case, we avoid
159d0 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69   deep.** recursi
159e0 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20  on, and thus do 
159f0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f  not need to enfo
15a00 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  rce the SQLITE_L
15a10 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
15a20 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c  LECT.** on a VAL
15a30 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  UES clause..**.*
15a40 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65  * Because the Se
15a50 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67  lect object orig
15a60 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41  inates from a VA
15a70 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20  LUES clause:.** 
15a80 20 20 28 31 29 20 54 68 65 72 65 20 69 73 20 6e    (1) There is n
15a90 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
15aa0 54 20 6f 72 20 65 6c 73 65 20 74 68 65 72 65 20  T or else there 
15ab0 69 73 20 61 20 4c 49 4d 49 54 20 6f 66 20 65 78  is a LIMIT of ex
15ac0 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20 28 32 29  actly 1.**   (2)
15ad0 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 55   All terms are U
15ae0 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33  NION ALL.**   (3
15af0 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  ) There is no OR
15b00 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
15b10 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49 54 20 6f  .** The "LIMIT o
15b20 66 20 65 78 61 63 74 6c 79 20 31 22 20 63 61 73  f exactly 1" cas
15b30 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28  e of condition (
15b40 31 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  1) comes about w
15b50 68 65 6e 20 61 20 56 41 4c 55 45 53 0a 2a 2a 20  hen a VALUES.** 
15b60 63 6c 61 75 73 65 20 6f 63 63 75 72 73 20 77 69  clause occurs wi
15b70 74 68 69 6e 20 73 63 61 6c 61 72 20 65 78 70 72  thin scalar expr
15b80 65 73 73 69 6f 6e 20 28 65 78 3a 20 22 53 45 4c  ession (ex: "SEL
15b90 45 43 54 20 28 56 41 4c 55 45 53 28 31 29 2c 28  ECT (VALUES(1),(
15ba0 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a 20 54 68  2),(3))")..** Th
15bb0 65 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  e sqlite3CodeSub
15bc0 73 65 6c 65 63 74 20 77 69 6c 6c 20 68 61 76 65  select will have
15bd0 20 61 64 64 65 64 20 74 68 65 20 4c 49 4d 49 54   added the LIMIT
15be0 20 31 20 63 6c 61 75 73 65 20 69 6e 20 74 68 74   1 clause in tht
15bf0 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e 63 65 20   case..** Since 
15c00 74 68 65 20 6c 69 6d 69 74 20 69 73 20 65 78 61  the limit is exa
15c10 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e 6c 79 20  ctly 1, we only 
15c20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75 74 65 73  need to evalutes
15c30 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 56   the left-most V
15c40 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61 74 69 63  ALUES..*/.static
15c50 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
15c60 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20  Values(.  Parse 
15c70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15c80 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15c90 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
15ca0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15cb0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
15cc0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
15cd0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
15ce0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
15cf0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15d00 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15d10 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ts */.){.  int n
15d20 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
15d30 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 53 68  c = 0;.  int bSh
15d40 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70 4c 69 6d 69  owAll = p->pLimi
15d50 74 3d 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20  t==0;.  assert( 
15d60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15d70 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20  _MultiValue );. 
15d80 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
15d90 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
15da0 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20  F_Values );.    
15db0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
15dc0 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d  K_ALL || (p->op=
15dd0 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d  =TK_SELECT && p-
15de0 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20  >pPrior==0) );. 
15df0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
15e00 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c  ext==0 || p->pEL
15e10 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70  ist->nExpr==p->p
15e20 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Next->pEList->nE
15e30 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70  xpr );.    if( p
15e40 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72  ->pPrior==0 ) br
15e50 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
15e60 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78   p->pPrior->pNex
15e70 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20  t==p );.    p = 
15e80 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e  p->pPrior;.    n
15e90 52 6f 77 20 2b 3d 20 62 53 68 6f 77 41 6c 6c 3b  Row += bShowAll;
15ea0 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20  .  }while(1);.  
15eb0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
15ec0 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22 53 43  ((pParse, 0, "SC
15ed0 41 4e 20 25 64 20 43 4f 4e 53 54 41 4e 54 20 52  AN %d CONSTANT R
15ee0 4f 57 25 73 22 2c 20 6e 52 6f 77 2c 0a 20 20 20  OW%s", nRow,.   
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 6e 52 6f 77 3d 3d 31 20 3f 20 22 22 20 3a 20   nRow==1 ? "" : 
15f10 22 53 22 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  "S"));.  while( 
15f20 70 20 29 7b 0a 20 20 20 20 73 65 6c 65 63 74 49  p ){.    selectI
15f30 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15f40 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 70 44   p, -1, 0, 0, pD
15f50 65 73 74 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  est, 1, 1);.    
15f60 69 66 28 20 21 62 53 68 6f 77 41 6c 6c 20 29 20  if( !bShowAll ) 
15f70 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53  break;.    p->nS
15f80 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b  electRow = nRow;
15f90 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
15fa0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
15fb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
15fc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15fd0 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
15fe0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
15ff0 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
16000 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
16010 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
16020 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
16030 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
16040 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
16050 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
16060 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
16070 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
16080 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
16090 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
160a0 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
160b0 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
160c0 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
160d0 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
160e0 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
160f0 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
16100 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
16110 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
16120 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
16130 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
16140 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
16150 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
16160 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
16170 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
16180 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
16190 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
161a0 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
161b0 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
161c0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
161d0 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
161e0 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
161f0 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
16200 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
16210 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
16220 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
16230 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
16240 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
16250 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
16260 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
16270 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
16280 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16290 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
162a0 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
162b0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
162c0 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
162d0 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
162e0 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
162f0 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
16300 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
16310 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
16320 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
16330 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
16340 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
16350 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
16360 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
16370 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
16380 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
16390 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
163a0 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
163b0 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
163c0 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
163d0 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
163e0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
163f0 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
16400 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
16410 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
16420 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
16430 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16440 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
16450 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16460 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
16470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
16480 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
16490 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
164a0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
164b0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
164c0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
164d0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
164e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
164f0 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
16500 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
16510 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
16520 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
16530 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
16540 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
16550 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
16560 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
16570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
16580 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16590 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
165a0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
165b0 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
165c0 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
165d0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
165e0 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
165f0 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
16600 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
16610 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
16620 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
16630 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
16640 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ection */..  /* 
16650 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
16660 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
16670 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
16680 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
16690 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
166a0 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
166b0 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
166c0 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
166d0 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
166e0 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  IMIT..  */.  ass
166f0 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72  ert( p && p->pPr
16700 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69  ior );  /* Calli
16710 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72  ng function guar
16720 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68  antees this much
16730 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
16740 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
16750 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c  Recursive)==0 ||
16760 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
16770 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  | p->op==TK_UNIO
16780 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  N );.  db = pPar
16790 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
167a0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
167b0 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
167c0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
167d0 64 65 72 42 79 20 7c 7c 20 70 50 72 69 6f 72 2d  derBy || pPrior-
167e0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
167f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16800 50 61 72 73 65 2c 22 25 73 20 63 6c 61 75 73 65  Parse,"%s clause
16810 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
16820 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
16830 22 2c 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  ",.      pPrior-
16840 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 3f 20 22  >pOrderBy!=0 ? "
16850 4f 52 44 45 52 20 42 59 22 20 3a 20 22 4c 49 4d  ORDER BY" : "LIM
16860 49 54 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  IT", selectOpNam
16870 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
16880 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
16890 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
168a0 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
168b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
168c0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
168d0 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
168e0 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
168f0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
16900 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
16910 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
16920 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
16930 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
16940 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
16950 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
16960 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
16970 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
16980 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
16990 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
169a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
169b0 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
169c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
169d0 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
169e0 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
169f0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68  ..  /* Special h
16a00 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f  andling for a co
16a10 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
16a20 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73  at originates as
16a30 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
16a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16a50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
16a60 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ltiValue ){.    
16a70 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
16a80 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
16a90 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
16aa0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
16ab0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
16ac0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
16ad0 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
16ae0 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
16af0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
16b00 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
16b10 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
16b20 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16b30 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
16b40 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
16b50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
16b60 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69  ist->nExpr==pPri
16b70 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
16b80 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  r );..#ifndef SQ
16b90 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
16ba0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16bb0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
16bc0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
16bd0 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
16be0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
16bf0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
16c00 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
16c10 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
16c20 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
16c30 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
16c40 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
16c50 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
16c60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
16c70 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
16c80 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
16c90 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
16ca0 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e{..#ifndef SQLI
16cb0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
16cc0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
16cd0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
16ce0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
16cf0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
16d00 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45 52 59 22  "COMPOUND QUERY"
16d10 29 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69  ));.      Explai
16d20 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
16d30 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d 4d 4f 53  se, 1, "LEFT-MOS
16d40 54 20 53 55 42 51 55 45 52 59 22 29 29 3b 0a 20  T SUBQUERY"));. 
16d50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
16d60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16d70 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
16d80 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
16d90 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
16da0 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  */.    switch( p
16db0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61  ->op ){.      ca
16dc0 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
16dd0 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
16de0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  0;.        int n
16df0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 61  Limit;.        a
16e00 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
16e10 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
16e20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
16e30 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
16e40 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
16e50 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
16e60 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  et;.        pPri
16e70 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
16e80 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
16e90 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
16ea0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
16eb0 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
16ec0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
16ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
16ef0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
16f00 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
16f10 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
16f20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
16f30 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
16f40 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
16f50 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
16f60 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
16f70 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
16f80 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
16f90 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
16fa0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16fb0 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d  P_IfNot, p->iLim
16fc0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
16fd0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
16fe0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16ff0 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
17000 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
17010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17020 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->iOffset ){.   
17030 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17040 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17050 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20 20  _OffsetLimit,.  
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
17080 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65  Limit, p->iOffse
17090 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  t+1, p->iOffset)
170a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
170b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
170c0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
170d0 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 55 4e  ((pParse, 1, "UN
170e0 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20 20 20 20  ION ALL"));.    
170f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17100 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
17110 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
17120 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
17130 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
17140 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
17150 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
17160 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
17170 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  rior;.        p-
17180 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
17190 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
171a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
171b0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
171c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
171d0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
171e0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
171f0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
17200 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2d 3e 70  Prior->pLimit->p
17210 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  Left, &nLimit). 
17220 20 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69          && nLimi
17230 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  t>0 && p->nSelec
17240 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f  tRow > sqlite3Lo
17250 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74  gEst((u64)nLimit
17260 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
17270 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
17280 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
17290 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69  ogEst((u64)nLimi
172a0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
172b0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
172c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
172d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
172e0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
172f0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
17300 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17310 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
17320 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55  .      case TK_U
17330 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 20 20  NION: {.        
17340 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
17350 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
17360 72 20 6f 66 20 74 68 65 20 74 65 6d 70 20 74 61  r of the temp ta
17370 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
17380 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 38  lt */.        u8
17390 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   op = 0;       /
173a0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
173b0 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
173c0 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
173d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 69  .        int pri
173e0 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
173f0 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
17400 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
17410 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
17420 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
17430 74 3b 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76  t;    /* Saved v
17440 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
17450 69 74 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  it  */.        i
17460 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20  nt addr;.       
17470 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
17480 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20 20 20 20  ndest;.  .      
17490 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
174a0 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a  p==TK_EXCEPT );.
174b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
174c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
174d0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69  N );.        pri
174e0 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
174f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
17500 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
17510 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  p ){.          /
17520 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
17530 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17540 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
17550 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
17560 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
17570 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
17580 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17590 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
175a0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
175b0 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
175c0 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
175d0 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
175e0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
175f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17600 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77           /* We w
17610 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
17620 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
17630 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
17640 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ld the.         
17650 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
17660 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
17670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17680 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
17690 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
176a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
176b0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
176c0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
176d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
176e0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
176f0 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62  emeral, unionTab
17700 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
17710 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
17720 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
17730 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
17740 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
17750 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
17760 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
17770 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
17780 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
17790 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
177a0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
177b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  ;.        }.  . 
177c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
177d0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
177e0 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
177f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17800 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
17810 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
17820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17830 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
17840 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
17850 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
17860 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17870 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17880 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
17890 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  dest);.        i
178a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
178b0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
178c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
178d0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
178e0 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
178f0 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
17900 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ent.        */. 
17910 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
17920 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20  ==TK_EXCEPT ){. 
17930 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52           op = SR
17940 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
17950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17960 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
17970 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
17980 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
17990 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  _Union;.        
179a0 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
179b0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
179c0 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
179d0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
179e0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
179f0 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
17a00 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
17a10 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
17a20 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
17a30 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  %s USING TEMP B-
17a40 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20 20 20  TREE",.         
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
17a70 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >op)));.        
17a80 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
17a90 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
17aa0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
17ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
17ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
17ad0 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
17ae0 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
17af0 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
17b00 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
17b10 64 65 72 42 79 2e 0a 20 20 20 20 20 20 20 20 2a  derBy..        *
17b20 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
17b30 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
17b40 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
17b50 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
17b60 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ak. */.        s
17b70 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
17b80 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
17b90 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70  erBy);.        p
17ba0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
17bb0 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
17bc0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
17bd0 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
17be0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
17bf0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
17c00 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  NION ){.        
17c10 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
17c20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17c30 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
17c40 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
17c50 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  tRow);.        }
17c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17c70 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
17c80 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
17c90 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
17ca0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
17cb0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
17cc0 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
17cd0 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20 20 20   = 0;.  .       
17ce0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
17cf0 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
17d00 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
17d10 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
17d20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20         ** it is 
17d30 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
17d40 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 20 20  y need..        
17d50 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
17d60 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
17d70 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
17d80 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
17d90 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
17da0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
17db0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rOp ){.         
17dc0 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
17dd0 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
17de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17df0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
17e00 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
17e10 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17e20 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  el(v);.         
17e30 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
17e40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17e50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70  ;.          comp
17e60 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
17e70 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
17e80 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
17e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17ea0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
17eb0 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
17ec0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17ed0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53  v);.          iS
17ee0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
17ef0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17f00 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65  ;.          sele
17f10 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
17f20 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  se, p, unionTab,
17f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f40 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
17f50 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
17f60 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
17f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17f80 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
17f90 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
17fa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17fb0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
17fc0 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
17fd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17fe0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17ff0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18000 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
18010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18020 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18030 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
18040 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
18050 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
18070 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d  ault: assert( p-
18080 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43  >op==TK_INTERSEC
18090 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 69  T ); {.        i
180a0 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
180b0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
180c0 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
180d0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  ;.        Expr *
180e0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
180f0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
18100 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74    SelectDest int
18110 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20  ersectdest;.    
18120 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 0a 20      int r1;.  . 
18130 20 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53         /* INTERS
18140 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
18150 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
18160 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
18170 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 77  es.        ** tw
18180 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
18190 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
181a0 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
181b0 20 42 65 67 69 6e 0a 20 20 20 20 20 20 20 20 2a   Begin.        *
181c0 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
181d0 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
181e0 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 20  ll need..       
181f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 61 62 31   */.        tab1
18200 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
18210 2b 3b 0a 20 20 20 20 20 20 20 20 74 61 62 32 20  +;.        tab2 
18220 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
18230 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
18240 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
18250 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 61   );.  .        a
18260 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
18270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
18280 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
18290 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  1, 0);.        a
182a0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
182b0 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
182c0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
182d0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
182e0 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69  addr;.        fi
182f0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
18300 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
18310 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
18320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18330 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 0a 20 20  >pEList );.  .  
18340 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
18350 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
18360 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
18370 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
18380 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  "..        */.  
18390 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
183a0 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
183b0 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
183c0 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
183d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
183e0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
183f0 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
18400 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
18410 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18420 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
18430 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
18440 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
18450 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
18460 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
18470 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
18480 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 20  e "tab2".       
18490 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
184a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
184b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
184c0 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
184d0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
184e0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
184f0 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
18500 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
18510 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
18520 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
18530 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
18540 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
18550 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
18560 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
18570 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65       intersectde
18580 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62  st.iSDParm = tab
18590 32 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  2;.        Expla
185a0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
185b0 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e  rse, 1, "%s USIN
185c0 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a  G TEMP B-TREE",.
185d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185e0 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
185f0 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b  OpName(p->op)));
18600 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18610 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
18620 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
18630 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tdest);.        
18640 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
18650 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
18660 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
18670 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
18680 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
18690 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
186a0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
186b0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
186c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
186d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
186e0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
186f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
18710 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
18720 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  mit);.        p-
18730 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
18740 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
18750 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18760 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
18770 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
18780 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
18790 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
187a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
187b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
187c0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
187d0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
187e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
187f0 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
18800 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18810 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
18820 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
18830 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
18840 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
18850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18860 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
18870 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
18880 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18890 76 29 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  v);.        r1 =
188a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
188b0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
188c0 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
188d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
188e0 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61  , OP_RowData, ta
188f0 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  b1, r1);.       
18900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18910 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
18920 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
18930 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  t, r1, 0);.     
18940 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18950 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
18960 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18970 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
18980 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
18990 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
189a0 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20  , tab1,.        
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
189d0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
189e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
189f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18a00 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
18a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18a20 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
18a30 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  b1, iStart); Vdb
18a40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18a60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18a70 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
18a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18a90 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
18aa0 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
18ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18ac0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
18ad0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
18ae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18af0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 23 69   }.    }.  .  #i
18b00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18b10 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66  T_EXPLAIN.    if
18b20 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b  ( p->pNext==0 ){
18b30 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
18b40 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73  eryPlanPop(pPars
18b50 65 29 3b 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64  e);.    }.  #end
18b60 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43  if.  }.  .  /* C
18b70 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
18b80 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
18b90 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  by .  ** tempora
18ba0 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
18bb0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
18bc0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
18bd0 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
18be0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
18bf0 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
18c00 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20  orary tables..  
18c10 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63  **.  ** This sec
18c20 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74  tion is run by t
18c30 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
18c40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
18c50 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54  nly..  ** SELECT
18c60 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
18c70 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73  he left always s
18c80 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20  kip this part.  
18c90 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  The right-most. 
18ca0 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74   ** SELECT might
18cb0 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20   also skip this 
18cc0 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e  part if it has n
18cd0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
18ce0 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65  e and.  ** no te
18cf0 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65  mp tables are re
18d00 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  quired..  */.  i
18d10 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
18d20 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
18d30 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  l ){.    int i; 
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18d60 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
18d70 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
18d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
18d90 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
18da0 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
18db0 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
18dc0 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
18dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18de0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
18df0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18e00 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ts */.    CollSe
18e10 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
18e20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
18e30 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
18e40 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
18e50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
18e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18e70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18e80 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  of columns in re
18e90 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
18ea0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
18eb0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  t==0 );.    nCol
18ec0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
18ed0 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  xpr;.    pKeyInf
18ee0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
18ef0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c  foAlloc(db, nCol
18f00 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , 1);.    if( !p
18f10 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
18f20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18f30 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
18f40 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
18f50 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
18f60 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
18f70 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
18f80 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
18f90 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
18fa0 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
18fb0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
18fc0 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
18fd0 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
18fe0 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
18ff0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
19000 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
19010 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
19020 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
19030 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
19040 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
19050 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
19060 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
19070 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
19080 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
19090 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
190a0 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
190b0 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
190c0 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
190d0 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
190e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
190f0 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
19100 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
19110 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
19120 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
19130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
19140 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
19150 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
19160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
19180 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
19190 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
191a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
191b0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
191c0 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c  addr, (char*)sql
191d0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
191e0 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  KeyInfo),.      
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
19210 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
19220 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
19230 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
19240 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19250 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
19260 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
19270 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
19280 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
19290 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70   dest.iSdst;.  p
192a0 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65  Dest->nSdst = de
192b0 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69  st.nSdst;.  sqli
192c0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
192d0 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
192e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
192f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19300 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
19310 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72  CT */../*.** Err
19320 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77  or message for w
19330 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hen two or more 
19340 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f  terms of a compo
19350 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20  und select have 
19360 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a  different.** siz
19370 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a  e result sets..*
19380 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
19390 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
193a0 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  sError(Parse *pP
193b0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
193c0 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  {.  if( p->selFl
193d0 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
193e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
193f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19400 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20  all VALUES must 
19410 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
19420 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b  mber of terms");
19430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
19440 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19450 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
19460 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
19470 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
19480 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
19490 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
194a0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
194b0 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
194c0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a  (p->op));.  }.}.
194d0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
194e0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
194f0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
19500 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
19510 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
19520 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
19530 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
19540 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
19550 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
19560 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
19570 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
19580 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
19590 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
195a0 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
195b0 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
195c0 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
195d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
195e0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
195f0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
19600 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
19610 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
19620 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
19630 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
19640 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
19650 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
19660 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
19670 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
19680 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
19690 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
196a0 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
196b0 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
196c0 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
196d0 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
196e0 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
196f0 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
19700 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
19710 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
19720 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
19730 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
19740 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
19750 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
19760 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
19770 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
19780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
19790 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
197a0 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
197b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
197c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
197d0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
197e0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
197f0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
19800 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
19810 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
19820 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
19830 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
19840 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
19850 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
19860 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
19870 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
19880 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
19890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
198a0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
198b0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
198c0 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
198d0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
198e0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
198f0 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
19900 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
19910 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
19920 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
19930 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
19940 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
19950 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
19960 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
19970 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
19980 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
19990 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
199a0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
199b0 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
199c0 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
199d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
199e0 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
199f0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
19a00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
19a10 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
19a20 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
19a30 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
19a40 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
19a50 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
19a60 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
19a70 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
19a80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19a90 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
19aa0 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
19ab0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19ac0 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
19ad0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19ae0 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
19af0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
19b00 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
19b30 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
19b40 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
19b50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
19b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
19b80 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65  dr2+2, iContinue
19b90 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65  , addr2+2); Vdbe
19ba0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19bb0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19bc0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
19bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19be0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
19bf0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
19c00 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
19c10 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
19c20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19c30 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
19c40 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
19c50 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
19c60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
19c70 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
19c80 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
19c90 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
19ca0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
19cb0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
19cc0 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
19cd0 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
19ce0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73  Continue);..  as
19cf0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
19d00 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
19d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
19d20 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61  t->eDest!=SRT_Ta
19d30 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ble );.  switch(
19d40 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
19d50 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
19d60 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
19d70 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
19d80 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
19d90 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
19da0 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
19db0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
19dc0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
19dd0 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
19de0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19df0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
19e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19e10 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
19e20 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
19e30 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
19e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19e50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
19e60 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
19e70 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
19e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19e90 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
19ea0 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
19eb0 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
19ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19ed0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
19ee0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
19ef0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19f00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
19f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19f20 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19f30 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
19f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
19f50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19f60 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
19f70 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
19f80 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
19f90 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
19fa0 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a  ECT ...)"..    *
19fb0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
19fc0 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
19fd0 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r1;.      testca
19fe0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31  se( pIn->nSdst>1
19ff0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1a000 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1a010 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1a020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a030 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
1a040 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
1a050 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20  pIn->nSdst, .   
1a060 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
1a070 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d  ->zAffSdst, pIn-
1a080 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a090 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1a0a0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1a0b0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
1a0c0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
1a0d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a0e0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1a0f0 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
1a100 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20  ->iSDParm, r1,. 
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
1a130 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
1a140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a150 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a160 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
1a170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1a180 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1a190 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
1a1a0 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
1a1b0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
1a1c0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
1a1d0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1a1e0 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
1a1f0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
1a200 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
1a210 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
1a220 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1a230 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
1a240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a250 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70  n->nSdst==1 || p
1a260 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
1a270 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
1a280 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20  >nSdst!=1 );.   
1a290 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a2a0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
1a2b0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
1a2c0 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
1a2d0 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
1a2e0 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
1a2f0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
1a300 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
1a310 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a320 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
1a330 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1a340 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
1a350 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
1a360 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a370 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a380 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
1a390 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
1a3a0 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
1a3b0 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
1a3c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a3d0 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
1a3e0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
1a3f0 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
1a400 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
1a410 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
1a420 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1a430 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
1a440 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
1a450 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
1a460 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1a470 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a480 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
1a490 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
1a4a0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a4b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a4c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1a4d0 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
1a4e0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
1a4f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1a500 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
1a510 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
1a520 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
1a530 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
1a540 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
1a550 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1a560 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
1a570 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
1a580 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
1a590 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
1a5a0 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
1a5b0 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
1a5c0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
1a5d0 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
1a5e0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
1a5f0 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
1a600 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
1a610 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
1a620 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
1a630 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
1a640 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
1a650 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
1a660 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
1a670 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
1a680 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
1a690 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
1a6a0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
1a6b0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
1a6c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a6d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
1a6e0 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
1a6f0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
1a700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a710 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1a720 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
1a730 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
1a740 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
1a750 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1a760 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
1a770 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
1a780 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
1a790 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
1a7a0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
1a7b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a7c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
1a7d0 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c  rJumpZero, p->iL
1a7e0 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
1a7f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a800 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1a810 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
1a820 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
1a830 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1a840 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
1a850 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
1a860 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1a870 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
1a880 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
1a890 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
1a8a0 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
1a8b0 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
1a8c0 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
1a8d0 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
1a8e0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1a8f0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
1a900 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
1a910 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1a920 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
1a930 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
1a940 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
1a950 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
1a960 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
1a970 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
1a980 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
1a990 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
1a9a0 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
1a9b0 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
1a9c0 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
1a9d0 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
1a9e0 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
1a9f0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
1aa00 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
1aa10 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
1aa20 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
1aa30 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
1aa40 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
1aa50 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
1aa60 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
1aa70 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
1aa80 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
1aa90 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
1aaa0 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
1aab0 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
1aac0 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
1aad0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
1aae0 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
1aaf0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
1ab00 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
1ab10 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
1ab20 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
1ab30 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
1ab40 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
1ab50 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
1ab60 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
1ab70 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
1ab80 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
1ab90 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
1aba0 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
1abb0 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
1abc0 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
1abd0 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
1abe0 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
1abf0 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
1ac00 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1ac10 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
1ac20 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
1ac30 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
1ac40 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
1ac50 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
1ac60 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
1ac70 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
1ac80 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1ac90 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
1aca0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
1acb0 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
1acc0 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
1acd0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
1ace0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
1acf0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
1ad00 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
1ad10 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
1ad20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
1ad30 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
1ad40 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
1ad50 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
1ad60 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
1ad70 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
1ad80 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
1ad90 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1ada0 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
1adb0 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
1adc0 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
1add0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
1ade0 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
1adf0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1ae00 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
1ae10 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
1ae20 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
1ae30 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
1ae40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
1ae50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ae60 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1ae70 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1ae80 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
1ae90 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1aea0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1aeb0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1aec0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
1aed0 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
1aee0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1aef0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
1af00 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
1af10 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
1af20 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
1af30 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1af40 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1af50 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
1af60 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
1af70 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
1af80 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
1af90 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
1afa0 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
1afb0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
1afc0 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
1afd0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
1afe0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
1aff0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
1b000 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
1b010 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
1b020 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
1b030 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
1b040 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
1b050 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
1b060 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
1b070 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
1b080 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
1b090 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
1b0a0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
1b0b0 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
1b0c0 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
1b0d0 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
1b0e0 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
1b0f0 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
1b100 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
1b110 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
1b120 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
1b130 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
1b140 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
1b150 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
1b160 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
1b170 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
1b180 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
1b190 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
1b1a0 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
1b1b0 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
1b1c0 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
1b1d0 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
1b1e0 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
1b1f0 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
1b200 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
1b210 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
1b220 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
1b230 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
1b240 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
1b250 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
1b260 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
1b270 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
1b280 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
1b290 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
1b2a0 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
1b2b0 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
1b2c0 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
1b2d0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
1b2e0 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
1b2f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
1b300 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
1b310 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
1b320 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
1b330 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
1b340 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
1b350 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
1b360 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
1b370 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
1b380 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
1b390 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
1b3a0 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
1b3b0 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
1b3c0 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
1b3d0 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
1b3e0 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
1b3f0 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
1b400 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
1b410 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
1b420 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
1b430 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
1b440 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
1b450 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
1b460 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
1b470 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
1b480 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
1b490 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
1b4a0 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
1b4b0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
1b4c0 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
1b4d0 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
1b4e0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
1b4f0 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
1b500 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
1b510 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
1b520 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
1b530 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
1b540 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
1b550 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
1b560 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
1b570 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
1b580 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
1b590 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
1b5a0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
1b5b0 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
1b5c0 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
1b5d0 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
1b5e0 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
1b5f0 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
1b600 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1b610 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
1b620 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
1b630 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1b640 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
1b650 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
1b660 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1b670 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1b680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b690 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
1b6a0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
1b6b0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
1b6c0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
1b6d0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1b6e0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
1b6f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1b700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b710 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1b720 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
1b730 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
1b740 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
1b750 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
1b760 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
1b770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b780 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b790 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
1b7a0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
1b7b0 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
1b7c0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
1b7d0 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
1b7e0 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
1b7f0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
1b800 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
1b810 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
1b820 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
1b830 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1b840 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
1b850 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b860 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
1b870 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1b880 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
1b890 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
1b8a0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
1b8b0 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
1b8c0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
1b8d0 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
1b8e0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
1b8f0 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
1b900 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
1b910 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
1b920 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
1b930 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b940 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
1b950 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
1b960 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b970 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
1b980 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1b990 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
1b9a0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
1b9b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b9c0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
1b9d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b9e0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
1b9f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1ba00 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
1ba10 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1ba20 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
1ba30 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba40 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
1ba50 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ba60 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
1ba70 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
1ba80 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
1ba90 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
1baa0 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
1bab0 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
1bac0 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
1bad0 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
1bae0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1baf0 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
1bb00 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
1bb10 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1bb20 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
1bb30 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1bb40 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
1bb50 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
1bb60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1bb70 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
1bb80 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1bb90 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
1bba0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1bbb0 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
1bbc0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1bbd0 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
1bbe0 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
1bbf0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
1bc00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
1bc10 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
1bc20 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
1bc30 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
1bc40 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
1bc50 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
1bc60 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
1bc70 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
1bc80 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
1bc90 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
1bca0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
1bcb0 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
1bcc0 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
1bcd0 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
1bce0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
1bcf0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
1bd00 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
1bd10 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
1bd20 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
1bd30 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
1bd40 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
1bd50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
1bd60 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
1bd70 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
1bd80 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
1bd90 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
1bda0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
1bdb0 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
1bdc0 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
1bdd0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1bde0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1bdf0 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
1be00 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
1be10 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
1be20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
1be30 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
1be40 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
1be50 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
1be60 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
1be70 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
1be80 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
1be90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
1bea0 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
1beb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1bec0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1bed0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1bee0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1bef0 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
1bf00 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1bf10 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
1bf20 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
1bf30 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1bf40 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1bf50 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1bf60 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
1bf70 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
1bf80 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
1bf90 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
1bfa0 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73  olumns */..  ass
1bfb0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
1bfc0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1bfd0 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
1bfe0 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
1bff0 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
1c000 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
1c010 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1c020 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
1c030 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1c040 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
1c050 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
1c060 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
1c070 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
1c080 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
1c090 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c0a0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
1c0b0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
1c0c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1c0d0 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
1c0e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c0f0 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
1c100 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
1c110 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
1c120 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
1c130 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
1c140 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1c150 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
1c160 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
1c170 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
1c180 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
1c190 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
1c1a0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
1c1b0 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
1c1c0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1c1d0 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
1c1e0 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
1c1f0 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
1c200 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
1c210 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
1c220 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
1c230 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
1c240 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
1c250 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
1c260 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
1c270 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
1c280 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
1c290 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1c2a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1c2b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1c2c0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
1c2d0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
1c2e0 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
1c2f0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c300 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1c310 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c320 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
1c330 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
1c340 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
1c350 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c360 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
1c370 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
1c380 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
1c390 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1c3a0 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
1c3b0 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
1c3c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1c3d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c3e0 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
1c3f0 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
1c400 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
1c410 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
1c420 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
1c430 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71   = pOrderBy = sq
1c440 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1c450 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
1c460 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
1c470 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
1c480 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
1c490 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e  nOrderBy++].u.x.
1c4a0 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
1c4b0 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
1c4c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
1c4d0 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
1c4e0 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
1c4f0 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
1c500 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
1c510 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
1c520 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
1c530 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
1c540 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
1c550 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
1c560 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
1c570 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
1c580 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
1c590 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
1c5a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
1c5b0 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
1c5c0 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
1c5d0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
1c5e0 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
1c5f0 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
1c600 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
1c610 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
1c620 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
1c630 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
1c640 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
1c650 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64  izeof(int)*(nOrd
1c660 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66  erBy + 1));.  if
1c670 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
1c680 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1c690 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1c6a0 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d     aPermute[0] =
1c6b0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66   nOrderBy;.    f
1c6c0 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f  or(i=1, pItem=pO
1c6d0 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f  rderBy->a; i<=nO
1c6e0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
1c6f0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
1c700 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
1c710 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
1c720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c730 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1c740 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
1c750 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1c760 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
1c770 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1c780 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
1c790 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
1c7a0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1c7b0 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
1c7c0 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  e, p, 1);.  }els
1c7d0 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
1c7e0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1c7f0 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
1c800 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
1c810 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1c820 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1c830 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
1c840 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
1c850 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1c860 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
1c870 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
1c880 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
1c890 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
1c8a0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
1c8b0 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
1c8c0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
1c8d0 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
1c8e0 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
1c8f0 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
1c900 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
1c910 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
1c920 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
1c930 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
1c940 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1c950 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1c960 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
1c970 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
1c980 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
1c990 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
1c9a0 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
1c9b0 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
1c9c0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1c9d0 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
1c9e0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1c9f0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
1ca00 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+1;.    sqlite3
1ca10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ca20 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
1ca30 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
1ca40 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  up = sqlite3KeyI
1ca50 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
1ca60 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
1ca70 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20  pKeyDup ){.     
1ca80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ca90 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
1caa0 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20  le(pKeyDup) );. 
1cab0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1cac0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1cad0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
1cae0 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
1caf0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
1cb00 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
1cb10 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
1cb20 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
1cb30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cb40 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
1cb50 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
1cb60 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
1cb70 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
1cb80 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
1cb90 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  = 0;.  pPrior->p
1cba0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Next = 0;.  sqli
1cbb0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1cbc0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1cbd0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
1cbe0 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
1cbf0 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
1cc00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
1cc10 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
1cc20 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
1cc30 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
1cc40 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
1cc50 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
1cc60 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
1cc70 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
1cc80 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
1cc90 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
1cca0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
1ccb0 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
1ccc0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
1ccd0 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
1cce0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
1ccf0 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
1cd00 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1cd10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cd20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
1cd30 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
1cd40 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd70 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
1cd80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cd90 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1cda0 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
1cdb0 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
1cdc0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
1cdd0 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
1cde0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
1cdf0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
1ce00 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
1ce10 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64  it = 0;..  regAd
1ce20 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drA = ++pParse->
1ce30 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
1ce40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ce50 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
1ce60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1ce70 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
1ce80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
1ce90 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1cea0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
1ceb0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1cec0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
1ced0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
1cee0 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
1cef0 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
1cf00 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
1cf10 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
1cf20 4d 45 52 47 45 20 28 25 73 29 22 2c 20 73 65 6c  MERGE (%s)", sel
1cf30 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
1cf40 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
1cf50 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
1cf60 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
1cf70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1cf80 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74  to the.  ** left
1cf90 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1cfa0 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20   operator - the 
1cfb0 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  "A" select..  */
1cfc0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
1cfd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1cfe0 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1cff0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1d000 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d010 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1d020 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
1d030 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
1d040 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
1d050 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
1d060 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
1d070 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45  = regLimitA;.  E
1d080 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
1d090 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46  (pParse, 1, "LEF
1d0a0 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  T"));.  sqlite3S
1d0b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
1d0c0 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
1d0d0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
1d0e0 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41  oroutine(v, regA
1d0f0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1d100 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1d110 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65  addr1);..  /* Ge
1d120 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
1d130 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
1d140 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1d150 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
1d160 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
1d170 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
1d180 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
1d190 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1d1a0 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
1d1b0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
1d1c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
1d1d0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
1d1e0 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65  AddrB, 0, addrSe
1d1f0 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f  lectB);.  VdbeCo
1d200 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74  mment((v, "right
1d210 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
1d220 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
1d230 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
1d240 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
1d250 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1d260 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
1d270 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
1d280 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
1d290 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52  n((pParse, 1, "R
1d2a0 49 47 48 54 22 29 29 3b 0a 20 20 73 71 6c 69 74  IGHT"));.  sqlit
1d2b0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1d2c0 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
1d2d0 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
1d2e0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
1d2f0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
1d300 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
1d310 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1d320 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
1d330 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d340 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1d350 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1d360 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
1d370 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1d380 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1d390 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1d3a0 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
1d3b0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d3c0 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1d3d0 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
1d3e0 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
1d3f0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
1d400 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
1d410 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
1d420 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
1d430 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
1d440 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
1d450 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
1d460 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
1d470 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1d480 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1d490 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1d4a0 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
1d4b0 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
1d4c0 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
1d4d0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
1d4e0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
1d4f0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1d500 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1d510 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d520 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1d530 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
1d540 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
1d550 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1d560 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
1d590 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1d5b0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1d5c0 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
1d5d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
1d5e0 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
1d5f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1d600 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1d610 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1d620 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
1d630 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1d640 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1d650 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
1d660 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1d670 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
1d680 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1d690 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1d6a0 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
1d6b0 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
1d6c0 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1d6d0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d6e0 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
1d6f0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1d700 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
1d710 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1d720 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1d730 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
1d740 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
1d750 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d760 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1d770 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1d7b0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1d7c0 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1d7d0 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
1d7e0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
1d7f0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
1d800 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
1d810 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
1d820 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1d830 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1d840 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1d850 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1d860 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
1d870 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1d880 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1d890 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
1d8a0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
1d8b0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1d8c0 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
1d8d0 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
1d8e0 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
1d8f0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
1d900 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1d910 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1d920 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
1d930 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1d940 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
1d950 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d960 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
1d970 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d980 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1d990 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1d9a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d9b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1d9c0 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
1d9d0 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
1d9e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1d9f0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1da00 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
1da10 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1da20 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1da30 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
1da40 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1da50 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
1da60 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1da70 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
1da80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1da90 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1daa0 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1dab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dac0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dad0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1dae0 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1daf0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1db00 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1db10 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
1db20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1db30 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1db40 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
1db50 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1db60 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1db70 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
1db80 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1db90 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1dba0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1dbb0 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
1dbc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
1dbd0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1dbe0 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
1dbf0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1dc00 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
1dc10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dc20 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1dc30 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1dc40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1dc50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dc60 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1dc70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1dc80 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1dc90 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1dca0 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1dcb0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1dcc0 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1dcd0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1dce0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1dcf0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1dd00 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1dd10 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1dd20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1dd30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dd40 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1dd50 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1dd60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dd70 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dd80 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1dd90 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1dda0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1ddb0 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1ddc0 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
1ddd0 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
1dde0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
1ddf0 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
1de00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1de10 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1de20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1de30 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1de40 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1de50 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1de60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1de70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1de80 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1de90 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1dea0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1deb0 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1dec0 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1ded0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1dee0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1def0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1df00 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1df10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1df20 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1df30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1df40 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1df50 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1df60 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1df70 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1df80 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1df90 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfb0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1dfc0 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1dfd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dfe0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1dff0 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1e000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1e010 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1e020 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1e030 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1e040 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1e050 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1e060 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1e070 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1e080 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1e090 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1e0a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1e0b0 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65  elEnd);..  /* Re
1e0c0 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
1e0d0 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
1e0e0 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
1e0f0 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
1e100 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
1e110 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
1e120 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1e130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
1e140 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
1e150 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
1e160 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1e170 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e  or;.  pPrior->pN
1e180 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a  ext = p;..  /***
1e190 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
1e1a0 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
1e1b0 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
1e1c0 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
1e1d0 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
1e1e0 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51  ****/.  ExplainQ
1e1f0 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72  ueryPlanPop(pPar
1e200 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  se);.  return pP
1e210 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d  arse->nErr!=0;.}
1e220 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
1e230 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e240 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1e250 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e260 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e  MIT_VIEW)../* An
1e270 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1e280 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62   SubstContext ob
1e290 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 61  ject describes a
1e2a0 6e 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65  n substitution e
1e2b0 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72  dit.** to be per
1e2c0 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73  formed on a pars
1e2d0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  e tree..**.** Al
1e2e0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
1e2f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
1e300 20 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62   iTable are to b
1e310 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f  e replaced by co
1e320 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65  rresponding.** e
1e330 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45  xpressions in pE
1e340 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  List..*/.typedef
1e350 20 73 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e   struct SubstCon
1e360 74 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a  text {.  Parse *
1e370 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1e380 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1e390 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
1e3a0 6e 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20  nt iTable;      
1e3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1e3c0 61 63 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ace references t
1e3d0 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
1e3e0 20 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b    int iNewTable;
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e400 65 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  ew table number 
1e410 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
1e420 6f 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oin;           /
1e430 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c  * Add TK_IF_NULL
1e440 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20  _ROW opcodes on 
1e450 65 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74  each replacement
1e460 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1e470 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
1e480 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65  /* Replacement e
1e490 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20  xpressions */.} 
1e4a0 53 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f  SubstContext;../
1e4b0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
1e4c0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
1e4d0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1e4e0 69 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74  ist(SubstContext
1e4f0 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
1e500 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1e510 53 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74  Select(SubstCont
1e520 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69  ext*, Select*, i
1e530 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  nt);../*.** Scan
1e540 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
1e550 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
1e560 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
1e570 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
1e580 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
1e590 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
1e5a0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1e5b0 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
1e5c0 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
1e5d0 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
1e5e0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
1e5f0 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
1e600 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
1e610 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1e620 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
1e630 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
1e640 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
1e650 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
1e660 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
1e670 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
1e680 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
1e690 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
1e6a0 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
1e6b0 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
1e6c0 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1e6d0 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
1e6e0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
1e6f0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
1e700 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65  ine makes the ne
1e710 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1e720 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1e730 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1e740 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1e750 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1e760 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1e770 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1e780 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1e790 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1e7a0 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1e7b0 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1e7c0 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73  *pSubst,  /* Des
1e7d0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1e7e0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1e7f0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
1e800 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
1e810 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
1e820 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
1e830 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
1e840 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e850 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1e860 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
1e870 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70  romJoin).   && p
1e880 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1e890 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69  Table==pSubst->i
1e8a0 54 61 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70  Table.  ){.    p
1e8b0 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1e8c0 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e  Table = pSubst->
1e8d0 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  iNewTable;.  }. 
1e8e0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1e8f0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
1e900 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62  pr->iTable==pSub
1e910 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20  st->iTable ){.  
1e920 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1e930 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1e940 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
1e950 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1e960 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1e970 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  ;.      Expr *pC
1e980 6f 70 79 20 3d 20 70 53 75 62 73 74 2d 3e 70 45  opy = pSubst->pE
1e990 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
1e9a0 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
1e9b0 20 20 20 20 20 45 78 70 72 20 69 66 4e 75 6c 6c       Expr ifNull
1e9c0 52 6f 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Row;.      asser
1e9d0 74 28 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73  t( pSubst->pELis
1e9e0 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
1e9f0 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70  Column<pSubst->p
1ea00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1ea10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1ea20 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
1ea30 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
1ea40 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
1ea50 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
1ea60 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a 20 20 20  or(pCopy) ){.   
1ea70 20 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74       sqlite3Vect
1ea80 6f 72 45 72 72 6f 72 4d 73 67 28 70 53 75 62 73  orErrorMsg(pSubs
1ea90 74 2d 3e 70 50 61 72 73 65 2c 20 70 43 6f 70 79  t->pParse, pCopy
1eaa0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1eab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
1eac0 2a 64 62 20 3d 20 70 53 75 62 73 74 2d 3e 70 50  *db = pSubst->pP
1ead0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
1eae0 20 20 69 66 28 20 70 53 75 62 73 74 2d 3e 69 73    if( pSubst->is
1eaf0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70 43 6f 70  LeftJoin && pCop
1eb00 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  y->op!=TK_COLUMN
1eb10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1eb20 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52 6f 77 2c  mset(&ifNullRow,
1eb30 20 30 2c 20 73 69 7a 65 6f 66 28 69 66 4e 75 6c   0, sizeof(ifNul
1eb40 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20  lRow));.        
1eb50 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d    ifNullRow.op =
1eb60 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b   TK_IF_NULL_ROW;
1eb70 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1eb80 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20 70 43 6f  lRow.pLeft = pCo
1eb90 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  py;.          if
1eba0 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c 65 20 3d  NullRow.iTable =
1ebb0 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1ebc0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  le;.          pC
1ebd0 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77  opy = &ifNullRow
1ebe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ebf0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1ec00 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
1ec10 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  opy, 0);.       
1ec20 20 69 66 28 20 70 4e 65 77 20 26 26 20 70 53 75   if( pNew && pSu
1ec30 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1ec40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
1ec50 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
1ec60 77 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  w, EP_CanBeNull)
1ec70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ec80 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1ec90 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1eca0 70 45 78 70 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69  pExpr,EP_FromJoi
1ecb0 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
1ecc0 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  pNew->iRightJoin
1ecd0 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
1ece0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1ecf0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
1ed00 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  tProperty(pNew, 
1ed10 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1ed20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ed30 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1ed40 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
1ed50 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
1ed60 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
1ed70 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1ed80 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1ed90 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20  _IF_NULL_ROW && 
1eda0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1edb0 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1edc0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
1edd0 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1ede0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  NewTable;.    }.
1edf0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1ee00 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1ee10 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  bst, pExpr->pLef
1ee20 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
1ee30 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
1ee40 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1ee50 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
1ee60 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1ee70 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1ee80 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1ee90 73 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62  substSelect(pSub
1eea0 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  st, pExpr->x.pSe
1eeb0 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65  lect, 1);.    }e
1eec0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1eed0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1eee0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1eef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ef00 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
1ef10 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1ef20 78 70 72 4c 69 73 74 28 0a 20 20 53 75 62 73 74  xprList(.  Subst
1ef30 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1ef40 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1ef50 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1ef60 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
1ef70 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20 2f  t *pList       /
1ef80 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
1ef90 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
1efa0 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
1efb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1efc0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1efd0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1efe0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1eff0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
1f000 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
1f010 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1f020 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
1f030 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Expr);.  }.}.sta
1f040 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1f050 6c 65 63 74 28 0a 20 20 53 75 62 73 74 43 6f 6e  lect(.  SubstCon
1f060 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a  text *pSubst, /*
1f070 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1f080 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1f090 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f0b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1f0c0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1f0d0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
1f0e0 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20  /.  int doPrior 
1f0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1f100 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70  substitutes on p
1f110 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a  ->pPrior too */.
1f120 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1f130 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
1f140 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1f150 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1f160 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
1f170 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  do{.    substExp
1f180 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1f190 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75  >pEList);.    su
1f1a0 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1f1b0 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  st, p->pGroupBy)
1f1c0 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
1f1d0 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  ist(pSubst, p->p
1f1e0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
1f1f0 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1f200 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e  Expr(pSubst, p->
1f210 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d  pHaving);.    p-
1f220 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1f230 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  xpr(pSubst, p->p
1f240 57 68 65 72 65 29 3b 0a 20 20 20 20 70 53 72 63  Where);.    pSrc
1f250 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1f260 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
1f270 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  );.    for(i=pSr
1f280 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
1f290 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
1f2a0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1f2b0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 53    substSelect(pS
1f2c0 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65  ubst, pItem->pSe
1f2d0 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  lect, 1);.      
1f2e0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1f2f0 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
1f300 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1f310 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e  (pSubst, pItem->
1f320 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
1f330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
1f340 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26 26  hile( doPrior &&
1f350 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29   (p = p->pPrior)
1f360 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  !=0 );.}.#endif 
1f370 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1f380 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f390 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1f3a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1f3b0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
1f3c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f3d0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f3e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f3f0 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
1f400 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1f410 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
1f420 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
1f430 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
1f440 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
1f450 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
1f460 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
1f470 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
1f480 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
1f490 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
1f4a0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
1f4b0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
1f4c0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
1f4d0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
1f4e0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
1f4f0 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
1f500 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1f510 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
1f520 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
1f530 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
1f540 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
1f550 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
1f560 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
1f570 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
1f580 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1f590 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
1f5a0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
1f5b0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
1f5c0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
1f5d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1f5e0 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
1f5f0 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
1f600 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
1f610 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
1f620 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
1f630 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
1f640 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
1f650 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
1f660 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
1f670 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
1f680 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
1f690 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1f6a0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
1f6b0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
1f6c0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
1f6d0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
1f6e0 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
1f6f0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1f700 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
1f710 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
1f720 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
1f730 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
1f740 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69  or this simplifi
1f750 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
1f760 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
1f770 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
1f780 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
1f790 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
1f7a0 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
1f7b0 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1f7c0 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
1f7d0 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
1f7e0 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
1f7f0 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
1f800 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 73   Flattening is s
1f810 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
1f820 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 72 61 69  llowing constrai
1f830 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  nts:.**.**  (**)
1f840 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1f850 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1f860 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1f870 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20  ueries. Was:.** 
1f880 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75         The subqu
1f890 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1f8a0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1f8b0 6f 74 68 20 62 65 20 61 67 67 72 65 67 61 74 65  oth be aggregate
1f8c0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1f8d0 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74  We no longer att
1f8e0 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20  empt to flatten 
1f8f0 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
1f900 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20  ries. Was:.**   
1f910 20 20 20 20 20 28 32 29 20 49 66 20 74 68 65 20       (2) If the 
1f920 73 75 62 71 75 65 72 79 20 69 73 20 61 6e 20 61  subquery is an a
1f930 67 67 72 65 67 61 74 65 20 74 68 65 6e 0a 2a 2a  ggregate then.**
1f940 20 20 20 20 20 20 20 20 28 32 61 29 20 74 68 65          (2a) the
1f950 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1f960 74 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  t not be a join 
1f970 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  and.**        (2
1f980 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  b) the outer que
1f990 72 79 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 20  ry must not use 
1f9a0 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20  subqueries.**   
1f9b0 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
1f9c0 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 46 52 4f  than the one FRO
1f9d0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1f9e0 79 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64  y that is a cand
1f9f0 69 64 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  idate.**        
1fa00 20 20 20 20 20 66 6f 72 20 66 6c 61 74 74 65 6e       for flatten
1fa10 69 6e 67 2e 20 20 28 54 68 69 73 20 69 73 20 64  ing.  (This is d
1fa20 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66  ue to ticket [2f
1fa30 37 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d  7170d73bf9abf80]
1fa40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1fa50 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e  from 2015-02-09.
1fa60 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 49  ).**.**   (3)  I
1fa70 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1fa80 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1fa90 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
1faa0 49 4e 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  IN then.**      
1fab0 20 20 28 33 61 29 20 74 68 65 20 73 75 62 71 75    (3a) the subqu
1fac0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
1fad0 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20   join and.**    
1fae0 20 20 20 20 28 33 62 29 20 74 68 65 20 46 52 4f      (3b) the FRO
1faf0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1fb00 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1fb10 20 63 6f 6e 74 61 69 6e 20 61 20 76 69 72 74 75   contain a virtu
1fb20 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
1fb30 20 20 74 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 20    table and.**  
1fb40 20 20 20 20 20 20 28 33 63 29 20 74 68 65 20 6f        (3c) the o
1fb50 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fb60 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
1fb70 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  te..**.**   (4) 
1fb80 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1fb90 6e 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43  n not be DISTINC
1fba0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1fbb0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1fbc0 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1fbd0 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1fbe0 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1fbf0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1fc00 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1fc10 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1fc20 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1fc30 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1fc40 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1fc50 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1fc60 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1fc70 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1fc80 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1fc90 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
1fca0 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
1fcb0 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
1fcc0 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57  e subqueries.  W
1fcd0 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 49 66  as:.**        If
1fce0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1fcf0 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 20   aggregate, the 
1fd00 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1fd10 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e  not be DISTINCT.
1fd20 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1fd30 65 20 73 75 62 71 75 65 72 79 20 6d 75 73 74 20  e subquery must 
1fd40 68 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75  have a FROM clau
1fd50 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1fd60 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1fd70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1fd80 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1fd90 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1fda0 4f 4d 20 63 6c 61 75 73 65 20 77 69 74 68 20 74  OM clause with t
1fdb0 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1fdc0 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1fdd0 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1fde0 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1fdf0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1fe00 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1fe10 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1fe20 20 28 38 29 20 20 49 66 20 74 68 65 20 73 75 62   (8)  If the sub
1fe30 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1fe40 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1fe50 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1fe60 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
1fe70 20 28 39 29 20 20 49 66 20 74 68 65 20 73 75 62   (9)  If the sub
1fe80 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1fe90 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1fea0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1feb0 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a   aggregate..**.*
1fec0 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63  *  (**)  Restric
1fed0 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65  tion (10) was re
1fee0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63  moved from the c
1fef0 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30  ode on 2005-02-0
1ff00 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20  5 but we.**     
1ff10 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61     accidently ca
1ff20 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e  rried the commen
1ff30 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20  t forward until 
1ff40 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69  2014-09-15.  Ori
1ff50 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
1ff60 63 6f 6e 73 74 72 61 69 6e 74 3a 20 22 49 66 20  constraint: "If 
1ff70 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1ff80 61 67 67 72 65 67 61 74 65 20 74 68 65 6e 20 74  aggregate then t
1ff90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a  he outer query .
1ffa0 2a 2a 20 20 20 20 20 20 20 20 6d 61 79 20 6e 6f  **        may no
1ffb0 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1ffc0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1ffd0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1ffe0 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1fff0 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
20000 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
20010 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
20020 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
20030 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
20040 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
20050 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
20060 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
20070 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
20080 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
20090 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
200a0 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
200b0 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
200c0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68  ery may not both
200d0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
200e0 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
200f0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73  query may not us
20100 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  e OFFSET..**.** 
20110 20 28 31 35 29 20 20 49 66 20 74 68 65 20 6f 75   (15)  If the ou
20120 74 65 72 20 71 75 65 72 79 20 69 73 20 70 61 72  ter query is par
20130 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
20140 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 74 68 65  select, then the
20150 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
20160 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20  ery may not use 
20170 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20 20 20 20 20  LIMIT..**       
20180 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
20190 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30  39 and ticket [0
201a0 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a  2a8e81d44])..**.
201b0 2a 2a 20 20 28 31 36 29 20 20 49 66 20 74 68 65  **  (16)  If the
201c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
201d0 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 6e 20  aggregate, then 
201e0 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
201f0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
20200 73 65 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  se ORDER BY.  (T
20210 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
20220 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
20230 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
20240 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
20250 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
20260 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
20270 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
20280 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
20290 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
202a0 6c 65 63 74 2c 20 74 68 65 6e 0a 2a 2a 20 20 20  lect, then.**   
202b0 20 20 20 20 20 28 31 37 61 29 20 61 6c 6c 20 63       (17a) all c
202c0 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
202d0 73 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  s must be a UNIO
202e0 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20  N ALL, and.**   
202f0 20 20 20 20 20 28 31 37 62 29 20 6e 6f 20 74 65       (17b) no te
20300 72 6d 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  rms within the s
20310 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64  ubquery compound
20320 20 6d 61 79 20 62 65 20 61 67 67 72 65 67 61 74   may be aggregat
20330 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20340 20 20 6f 72 20 44 49 53 54 49 4e 43 54 2c 20 61    or DISTINCT, a
20350 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37  nd.**        (17
20360 63 29 20 65 76 65 72 79 20 74 65 72 6d 20 77 69  c) every term wi
20370 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72  thin the subquer
20380 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 75 73 74 20  y compound must 
20390 68 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75  have a FROM clau
203a0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37  se.**        (17
203b0 64 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  d) the outer que
203c0 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  ry may not be.**
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
203e0 37 64 31 29 20 61 67 67 72 65 67 61 74 65 2c 20  7d1) aggregate, 
203f0 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
20400 20 20 20 28 31 37 64 32 29 20 44 49 53 54 49 4e     (17d2) DISTIN
20410 43 54 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  CT, or.**       
20420 20 20 20 20 20 20 20 28 31 37 64 33 29 20 61 20         (17d3) a 
20430 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  join..**.**     
20440 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
20450 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
20460 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
20470 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
20480 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
20490 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
204a0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
204b0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
204c0 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
204d0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
204e0 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
204f0 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
20500 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
20510 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
20520 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
20530 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
20540 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
20550 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
20560 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
20570 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
20580 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
20590 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
205a0 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
205b0 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
205c0 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
205d0 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
205e0 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
205f0 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
20600 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
20610 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
20620 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
20630 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
20640 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
20650 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
20660 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
20670 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
20680 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
20690 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
206a0 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
206b0 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
206c0 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
206d0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
206e0 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
206f0 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
20700 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
20710 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
20720 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
20730 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
20740 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
20750 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
20760 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
20770 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6c       ORDER BY cl
20780 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
20790 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
207a0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
207b0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
207c0 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
207d0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
207e0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
207f0 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
20800 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
20810 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
20820 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45      have a WHERE
20830 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
20840 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62  (20)  If the sub
20850 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
20860 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
20870 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73  n it must not us
20880 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f  e.**        an O
20890 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
208a0 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20   Ticket #3773.  
208b0 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74  We could relax t
208c0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  his constraint.*
208d0 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61  *        somewha
208e0 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74  t by saying that
208f0 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
20900 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20910 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20  e must.**       
20920 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64   appear as unmod
20930 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c  ified result col
20940 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65  umns in the oute
20950 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65  r query.  But we
20960 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
20970 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
20980 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64  ons in mind to d
20990 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61  eal with that ca
209a0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20  se..**.**  (21) 
209b0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
209c0 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
209d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
209e0 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20   may not be.**  
209f0 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
20a00 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
20a10 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
20a20 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
20a30 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20a40 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
20a50 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 53  ..**.**  (**)  S
20a60 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
20a70 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 2e  triction (17d3).
20a80 20 20 57 61 73 3a 20 49 66 20 74 68 65 20 6f 75    Was: If the ou
20a90 74 65 72 20 71 75 65 72 79 20 69 73 0a 2a 2a 20  ter query is.** 
20aa0 20 20 20 20 20 20 20 61 20 72 65 63 75 72 73 69         a recursi
20ab0 76 65 20 43 54 45 2c 20 74 68 65 6e 20 74 68 65  ve CTE, then the
20ac0 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 6e   sub-query may n
20ad0 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  ot be a compound
20ae0 20 71 75 65 72 79 2e 0a 2a 2a 20 20 20 20 20 20   query..**      
20af0 20 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69    This restricti
20b00 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
20b10 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
20b20 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
20b30 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
20b40 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
20b50 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
20b60 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
20b70 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
20b80 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
20b90 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65  .**.**  (**)  We
20ba0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d   no longer attem
20bb0 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67  pt to flatten ag
20bc0 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
20bd0 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20  es.  Was:.**    
20be0 20 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79      The subquery
20bf0 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61   may not be an a
20c00 67 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73  ggregate that us
20c10 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  es the built-in 
20c20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20  min() or .**    
20c30 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e      or max() fun
20c40 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75  ctions.  (Withou
20c50 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
20c60 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65  on, a query like
20c70 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c  :.**        "SEL
20c80 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45  ECT x FROM (SELE
20c90 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f  CT max(y), x FRO
20ca0 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74  M t1)" would not
20cb0 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20   necessarily.** 
20cc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
20cd0 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68  e value X for wh
20ce0 69 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61  ich Y was maxima
20cf0 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32 35 29 20  l.).**.**  (25) 
20d00 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 73   If either the s
20d10 75 62 71 75 65 72 79 20 6f 72 20 74 68 65 20 70  ubquery or the p
20d20 61 72 65 6e 74 20 71 75 65 72 79 20 63 6f 6e 74  arent query cont
20d30 61 69 6e 73 20 61 20 77 69 6e 64 6f 77 0a 2a 2a  ains a window.**
20d40 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
20d50 20 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c   in the select l
20d60 69 73 74 20 6f 72 20 4f 52 44 45 52 20 42 59 20  ist or ORDER BY 
20d70 63 6c 61 75 73 65 2c 20 66 6c 61 74 74 65 6e 69  clause, flatteni
20d80 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20  ng.**        is 
20d90 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 0a 2a  not attempted..*
20da0 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
20db0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
20dc0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
20dd0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
20de0 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
20df0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
20e00 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
20e10 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
20e20 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
20e30 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
20e40 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
20e50 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
20e60 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
20e70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
20e80 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
20e90 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
20ea0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
20eb0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
20ec0 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
20ed0 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
20ee0 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
20ef0 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
20f00 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
20f10 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
20f20 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
20f30 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
20f40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
20f50 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
20f60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20f70 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
20f80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
20f90 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
20fa0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
20fb0 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
20fc0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
20fd0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
20fe0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
20ff0 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
21000 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
21010 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
21020 41 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f  Agg            /
21030 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
21040 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
21050 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
21060 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
21070 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
21080 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
21090 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
210a0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
210b0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
210c0 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
210d0 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
210e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
210f0 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
21100 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
21110 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
21120 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
21130 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
21140 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
21150 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
21160 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
21170 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
21180 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
21190 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
211a0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
211b0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
211c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
211d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
211e0 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
211f0 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
21200 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
21210 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
21220 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
21230 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72  */.  int iNewPar
21240 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c  ent = -1;/* Repl
21250 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f  acement table fo
21260 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  r iParent */.  i
21270 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20  nt isLeftJoin = 
21280 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53  0; /* True if pS
21290 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ub is the right 
212a0 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  side of a LEFT J
212b0 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74  OIN */    .  int
212c0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
212d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
212e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
212f0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
21300 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
21310 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
21320 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21330 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
21340 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
21350 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
21360 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21370 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
21380 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
21390 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
213a0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
213b0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
213c0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
213d0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
213e0 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  ;.  if( Optimiza
213f0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
21400 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
21410 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
21420 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
21430 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
21440 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
21450 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
21460 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
21470 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
21480 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
21490 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
214a0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
214b0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
214c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
214d0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  =0 );..  if( p->
214e0 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d 3e 70 57  pWin || pSub->pW
214f0 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  in ) return 0;  
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21520 32 35 29 20 2a 2f 0a 0a 20 20 70 53 75 62 53 72  25) */..  pSubSr
21530 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
21540 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
21550 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
21560 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
21570 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
21580 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
21590 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
215a0 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
215b0 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
215c0 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
215d0 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
215e0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
215f0 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
21600 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
21610 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
21620 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
21630 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
21640 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
21650 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
21660 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
21670 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
21680 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
21690 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
216a0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
216b0 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
216c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
216d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
216e0 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
216f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21700 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
21710 74 2d 3e 70 52 69 67 68 74 20 29 20 72 65 74 75  t->pRight ) retu
21720 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73 74 72  rn 0;   /* Restr
21730 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
21740 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
21750 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
21760 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
21770 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
21780 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
217c0 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
217d0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
217e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21810 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
21820 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
21830 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
21840 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21850 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21860 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28  on (4)  */.  if(
21870 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
21880 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
21890 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
218a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
218b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
218c0 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
218d0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
218e0 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
218f0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
21900 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21940 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
21950 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
21960 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
21970 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
21980 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21990 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
219a0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
219b0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
219c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
219d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
219e0 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
219f0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
21a00 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
21a10 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
21a20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
21a30 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
21a40 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
21a50 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
21a60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
21a70 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20  _Recursive) ){. 
21a80 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
21a90 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32  Restrictions (22
21aa0 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
21ab0 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
21ac0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21ad0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21ae0 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
21af0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
21b00 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
21b10 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45  n itself (3a). E
21b20 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68  xample of why th
21b30 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  is is not.  ** a
21b40 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
21b50 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
21b60 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
21b70 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
21b80 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
21b90 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
21ba0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
21bb0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
21bc0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
21bd0 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
21be0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
21bf0 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
21c00 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
21c10 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
21c20 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21c30 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21c40 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
21c50 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
21c60 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ry cannot be an 
21c70 61 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20  aggregate. (3c) 
21c80 20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69   This is an arti
21c90 66 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a  fact of the way.
21ca0 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20    ** aggregates 
21cb0 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20  are processed - 
21cc0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68  there is no mech
21cd0 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69  anism to determi
21ce0 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c  ne if.  ** the L
21cf0 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73  EFT JOIN table s
21d00 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c  hould be all-NUL
21d10 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  L..  **.  ** See
21d20 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33   also tickets #3
21d30 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33  06, #350, and #3
21d40 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  300..  */.  if( 
21d50 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
21d60 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
21d70 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c  R)!=0 ){.    isL
21d80 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20  eftJoin = 1;.   
21d90 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
21da0 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c  rc>1 || isAgg ||
21db0 20 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53   IsVirtual(pSubS
21dc0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  rc->a[0].pTab) )
21dd0 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29  {.      /*  (3a)
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63               (3c
21df0 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20  )     (3b) */.  
21e00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21e10 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
21e20 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55  QLITE_EXTRA_IFNU
21e30 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28  LLROW.  else if(
21e40 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41   iFrom>0 && !isA
21e50 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  gg ){.    /* Set
21e60 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20  ting isLeftJoin 
21e70 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f  to -1 causes OP_
21e80 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65  IfNullRow opcode
21e90 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  s to be generate
21ea0 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  d for.    ** eve
21eb0 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ry reference to 
21ec0 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
21ed0 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20  n from subquery 
21ee0 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a  in a join, even.
21ef0 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68      ** though th
21f00 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73  ey are not neces
21f10 73 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c  sary.  This will
21f20 20 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65   stress-test the
21f30 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20   OP_IfNullRow . 
21f40 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f     ** opcode. */
21f50 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
21f60 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  = -1;.  }.#endif
21f70 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
21f80 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20  on (17): If the 
21f90 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
21fa0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
21fb0 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
21fc0 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
21fd0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
21fe0 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
21ff0 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
22000 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
22010 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
22020 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
22030 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
22040 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
22050 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
22060 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
22070 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
22080 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
22090 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
220a0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
220b0 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a  striction (20) *
220c0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
220d0 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
220e0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
220f0 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
22100 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
22110 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28    return 0; /* (
22120 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f  17d1), (17d2), o
22130 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20  r (17d3) */.    
22140 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
22150 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
22160 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
22170 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
22180 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
22190 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
221a0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
221b0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
221c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
221d0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
221e0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
221f0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
22200 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
22210 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22220 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
22230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22240 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
22250 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr==pSub1->pELis
22260 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
22270 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
22280 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
22290 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
222a0 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31  te))!=0    /* (1
222b0 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  7b) */.       ||
222c0 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
222d0 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
222e0 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20  _ALL)           
222f0 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a        /* (17a) *
22300 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  /.       || pSub
22310 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20  1->pSrc->nSrc<1 
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20   /* (17c) */.   
22350 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
22360 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
22370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22380 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
22390 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
223a0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
223b0 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66   (18). */.    if
223c0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
223d0 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
223e0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
223f0 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
22400 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
22410 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
22420 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
22430 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
22440 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
22450 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22460 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f  /* Ex-restrictio
22470 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65  n (23):.  ** The
22480 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74   only way that t
22490 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72  he recursive par
224a0 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63  t of a CTE can c
224b0 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  ontain a compoun
224c0 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  d.  ** subquery 
224d0 69 73 20 66 6f 72 20 74 68 65 20 73 75 62 71 75  is for the subqu
224e0 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65  ery to be one te
224f0 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42  rm of a join.  B
22500 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73  ut if the.  ** s
22510 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
22520 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74  n, then the flat
22530 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61  tening has alrea
22540 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20  dy been stopped 
22550 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74  by.  ** restrict
22560 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a  ion (17d3).  */.
22570 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
22580 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
22590 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75  rsive)==0 || pSu
225a0 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  b->pPrior==0 );.
225b0 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
225c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
225d0 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
225e0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
225f0 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  /.  SELECTTRACE(
22600 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61  1,pParse,p,("fla
22610 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20  tten %s.%p from 
22620 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  term %d\n",.    
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22640 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  Sub->zSelName, p
22650 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20  Sub, iFrom));.. 
22660 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
22670 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
22680 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
22690 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
226a0 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e  >zName;.  TESTON
226b0 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41  LY(i =) sqlite3A
226c0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
226d0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
226e0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74  0, 0, 0);.  test
226f0 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f  case( i==SQLITE_
22700 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65  DENY );.  pParse
22710 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
22720 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
22730 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  xt;..  /* If the
22740 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
22750 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
22760 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
22770 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73  (by restrictions
22780 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20  .  ** 17 and 18 
22790 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62  above) it must b
227a0 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  e a UNION ALL an
227b0 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
227c0 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65  ry must .  ** be
227d0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
227e0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
227f0 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
22800 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
22810 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
22820 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
22830 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
22840 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
22850 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
22860 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
22870 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63  ** creates N-1 c
22880 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
22890 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75  ent query withou
228a0 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  t any ORDER BY, 
228b0 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f  LIMIT or .  ** O
228c0 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e  FFSET clauses an
228d0 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20  d joins them to 
228e0 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
228f0 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  de of the origin
22900 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e  al.  ** using UN
22910 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
22920 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
22930 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
22940 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73  of simple.  ** s
22950 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
22960 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
22970 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a   sub-query..  **
22980 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
22990 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
229a0 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20  ECT a+1 FROM (. 
229b0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
229c0 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T x FROM tab.  *
229d0 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
229e0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
229f0 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62  ELECT y FROM tab
22a00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
22a10 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
22a20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
22a30 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a  2) FROM tab2.  *
22a40 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21  *     ) WHERE a!
22a50 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  =5 ORDER BY 1.  
22a60 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72  **.  ** Transfor
22a70 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  med into:.  **. 
22a80 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
22a90 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
22aa0 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E x+1!=5.  **   
22ab0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
22ac0 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20       SELECT y+1 
22ad0 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79  FROM tab WHERE y
22ae0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
22af0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22b00 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
22b10 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48  )+1 FROM tab2 WH
22b20 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d  ERE abs(z*2)+1!=
22b30 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52  5.  **     ORDER
22b40 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
22b50 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65  We call this the
22b60 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75   "compound-subqu
22b70 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e  ery flattening".
22b80 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62  .  */.  for(pSub
22b90 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70  =pSub->pPrior; p
22ba0 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e  Sub; pSub=pSub->
22bb0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
22bc0 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45  ect *pNew;.    E
22bd0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
22be0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
22bf0 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  .    Expr *pLimi
22c00 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
22c10 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
22c20 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
22c30 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
22c40 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   0;.    p->pSrc 
22c50 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  = 0;.    p->pPri
22c60 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  or = 0;.    p->p
22c70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
22c80 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  New = sqlite3Sel
22c90 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29  ectDup(db, p, 0)
22ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
22cb0 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
22cc0 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29   pSub->zSelName)
22cd0 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
22ce0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
22cf0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
22d00 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72  erBy;.    p->pSr
22d10 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d  c = pSrc;.    p-
22d20 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
22d30 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
22d40 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
22d50 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = pPrior;.    }
22d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
22d70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
22d80 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  r;.      if( pPr
22d90 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e  ior ) pPrior->pN
22da0 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ext = pNew;.    
22db0 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
22dc0 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  p;.      p->pPri
22dd0 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  or = pNew;.     
22de0 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70   SELECTTRACE(2,p
22df0 50 61 72 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75  Parse,p,("compou
22e00 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
22e10 74 65 6e 65 72 22 0a 20 20 20 20 20 20 20 20 20  tener".         
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 20 22 20 63 72 65 61 74 65 73 20 25       " creates %
22e40 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c  s.%p as peer\n",
22e50 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  pNew->zSelName, 
22e60 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pNew));.    }.  
22e70 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
22e80 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
22e90 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  1;.  }..  /* Beg
22ea0 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  in flattening th
22eb0 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  e iFrom-th entry
22ec0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
22ed0 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  use .  ** in the
22ee0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
22ef0 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  */.  pSub = pSub
22f00 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  1 = pSubitem->pS
22f10 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c  elect;..  /* Del
22f20 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ete the transien
22f30 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
22f40 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
22f50 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
22f60 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
22f70 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
22f80 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
22f90 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
22fa0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22fb0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
22fc0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
22fd0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
22fe0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74    pSubitem->zDat
22ff0 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75  abase = 0;.  pSu
23000 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
23010 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ;.  pSubitem->zA
23020 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62  lias = 0;.  pSub
23030 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  item->pSelect = 
23040 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64  0;..  /* Defer d
23050 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c  eleting the Tabl
23060 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  e object associa
23070 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
23080 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c  * subquery until
23090 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
230a0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74   is.  ** complet
230b0 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d  e, since there m
230c0 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45  ay still exist E
230d0 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73  xpr.pTab entries
230e0 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72   that.  ** refer
230f0 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
23100 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74   even after flat
23110 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20  tening.  Ticket 
23120 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3346..  **.  **
23130 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
23140 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55  is always non-NU
23150 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72  LL by test restr
23160 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74  ictions and test
23170 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20  s above..  */.  
23180 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69  if( ALWAYS(pSubi
23190 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  tem->pTab!=0) ){
231a0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
231b0 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
231c0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
231d0 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52  pTabToDel->nTabR
231e0 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50  ef==1 ){.      P
231f0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
23200 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
23210 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
23220 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
23230 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70  >pNextZombie = p
23240 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
23250 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70  eTab;.      pTop
23260 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
23270 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20  b = pTabToDel;. 
23280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23290 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52  pTabToDel->nTabR
232a0 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef--;.    }.    
232b0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d  pSubitem->pTab =
232c0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
232d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70  e following loop
232e0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
232f0 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f  ach term in a co
23300 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a  mpound-subquery.
23310 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20    ** flattening 
23320 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62  (as described ab
23330 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65  ove).  If we are
23340 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65   doing a differe
23350 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20  nt kind.  ** of 
23360 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66  flattening - a f
23370 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20  lattening other 
23380 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  than a compound-
23390 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
233a0 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20  ing -.  ** then 
233b0 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72  this loop only r
233c0 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20  uns once..  **. 
233d0 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f   ** This loop mo
233e0 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ves all of the F
233f0 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
23400 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
23410 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
23420 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
23430 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
23440 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
23450 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
23460 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
23470 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
23480 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
23490 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
234a0 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
234b0 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
234c0 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
234d0 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
234e0 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
234f0 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
23500 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
23510 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
23520 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
23530 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
23540 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
23550 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
23560 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
23570 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
23580 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
23590 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
235a0 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b    for(pParent=p;
235b0 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e   pParent; pParen
235c0 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f  t=pParent->pPrio
235d0 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  r, pSub=pSub->pP
235e0 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rior){.    int n
235f0 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a  SubSrc;.    u8 j
23600 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ointype = 0;.   
23610 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
23620 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
23630 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62  OM clause of sub
23640 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75  query */.    nSu
23650 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e  bSrc = pSubSrc->
23660 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  nSrc;  /* Number
23670 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62   of terms in sub
23680 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
23690 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20  e */.    pSrc = 
236a0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20  pParent->pSrc;  
236b0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
236c0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
236d0 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28  uery */..    if(
236e0 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61   pSrc ){.      a
236f0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d  ssert( pParent==
23700 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74  p );  /* First t
23710 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ime through the 
23720 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f  loop */.      jo
23730 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65  intype = pSubite
23740 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a  m->fg.jointype;.
23750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23760 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
23770 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61  !=p );  /* 2nd a
23780 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69  nd subsequent ti
23790 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  mes through the 
237a0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53  loop */.      pS
237b0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
237c0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
237d0 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
237e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
237f0 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
23800 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
23810 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
23820 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
23830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23840 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
23850 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ry uses a single
23860 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f   slot of the FRO
23870 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
23880 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65  outer.    ** que
23890 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71  ry.  If the subq
238a0 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68  uery has more th
238b0 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  an one element i
238c0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
238d0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65  e,.    ** then e
238e0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
238f0 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70  query to make sp
23900 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f  ace for it to ho
23910 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a  ld all elements.
23920 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75      ** of the su
23930 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
23940 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
23950 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
23960 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
23970 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52  bA, (SELECT * FR
23980 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20  OM sub1, sub2), 
23990 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  tabB;.    **.   
239a0 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75   ** The outer qu
239b0 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20  ery has 3 slots 
239c0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
239d0 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66  se.  One slot of
239e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
239f0 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64  r query (the mid
23a00 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65  dle slot) is use
23a10 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72  d by the subquer
23a20 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20  y.  The next.   
23a30 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64   ** block of cod
23a40 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68  e will expand th
23a50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  e outer query FR
23a60 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73  OM clause to 4 s
23a70 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  lots..    ** The
23a80 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20   middle slot is 
23a90 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20  expanded to two 
23aa0 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74  slots in order t
23ab0 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20  o make space.   
23ac0 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20   ** for the two 
23ad0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
23ae0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
23af0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
23b00 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62   */.    if( nSub
23b10 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  Src>1 ){.      p
23b20 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70  Parent->pSrc = p
23b30 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
23b40 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
23b50 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c  pSrc, nSubSrc-1,
23b60 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20  iFrom+1);.      
23b70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
23b80 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
23b90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
23ba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61     }..    /* Tra
23bb0 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63  nsfer the FROM c
23bc0 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d  lause terms from
23bd0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
23be0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  to the.    ** ou
23bf0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
23c00 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
23c10 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
23c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c        sqlite3IdL
23c30 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  istDelete(db, pS
23c40 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70  rc->a[i+iFrom].p
23c50 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73  Using);.      as
23c60 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b  sert( pSrc->a[i+
23c70 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46  iFrom].fg.isTabF
23c80 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unc==0 );.      
23c90 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
23ca0 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
23cb0 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72 65  ;.      iNewPare
23cc0 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  nt = pSubSrc->a[
23cd0 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
23ce0 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
23cf0 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
23d00 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
23d10 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
23d20 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e  rc->a[iFrom].fg.
23d30 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
23d40 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
23d50 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
23d60 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
23d70 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
23d80 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
23d90 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
23da0 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
23db0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
23dc0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
23dd0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
23de0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
23df0 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
23e00 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
23e10 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
23e20 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
23e30 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
23e50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
23e60 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
23e70 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
23e80 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
23e90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
23ea0 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
23eb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23ec0 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
23ed0 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
23ee0 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
23ef0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
23f00 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
23f10 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
23f20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
23f30 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
23f40 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
23f50 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
23f60 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
23f70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
23f80 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
23f90 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
23fa0 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65  oint, any non-ze
23fb0 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76  ro iOrderByCol v
23fc0 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74  alues indicate t
23fd0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
23fe0 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e   ORDER BY column
23ff0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
24000 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20  dentical to the 
24010 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20  iOrderByCol'th. 
24020 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
24030 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  on returned by S
24040 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
24050 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73  pSub. Since thes
24060 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a  e values.      *
24070 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61  * do not necessa
24080 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20  rily correspond 
24090 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45  to columns in SE
240a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
240b0 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a  Parent,.      **
240c0 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72   zero them befor
240d0 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68  e transfering th
240e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
240f0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
24100 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74    ** Not doing t
24110 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e  his may cause an
24120 20 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73   error if a subs
24130 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74  equent call to t
24140 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
24150 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
24160 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70  o flatten a comp
24170 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
24180 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20  nto pParent.    
24190 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77    ** (the only w
241a0 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
241b0 65 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d  en is if the com
241c0 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20  pound sub-query 
241d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  is.      ** curr
241e0 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53  ently part of pS
241f0 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74  ub->pSrc). See t
24200 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38  icket [d11a6e908
24210 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78  f].  */.      Ex
24220 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
24230 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
24240 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  y;.      for(i=0
24250 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
24260 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
24270 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
24280 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
24290 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
242a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
242b0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
242c0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
242d0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
242e0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
242f0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
24300 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68  0;.    }.    pWh
24310 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
24320 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
24330 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69  Where, 0);.    i
24340 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20  f( isLeftJoin>0 
24350 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
24360 45 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65  Expr(pWhere, iNe
24370 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  wParent);.    }.
24380 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
24390 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
243a0 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c  rAnd(db, pWhere,
243b0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
243c0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
243d0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
243e0 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
243f0 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e  text x;.      x.
24400 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
24410 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20  .      x.iTable 
24420 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  = iParent;.     
24430 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69   x.iNewTable = i
24440 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
24450 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
24460 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20  isLeftJoin;.    
24470 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
24480 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  b->pEList;.     
24490 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c   substSelect(&x,
244a0 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20   pParent, 0);.  
244b0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
244c0 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
244d0 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
244e0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
244f0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
24500 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
24510 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
24520 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
24530 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
24540 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
24550 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
24560 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
24570 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
24580 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
24590 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
245a0 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
245b0 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
245c0 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
245d0 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
245e0 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
245f0 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
24600 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
24610 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
24620 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
24630 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
24640 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
24650 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
24660 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
24670 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
24680 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
24690 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
246a0 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
246b0 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
246c0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
246d0 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
246e0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
246f0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
24700 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53  , pSub1);..#if S
24710 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
24720 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
24730 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
24740 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
24750 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
24760 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c  rse,p,("After fl
24770 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a  attening:\n"));.
24780 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
24790 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
247a0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
247b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
247c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
247d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
247e0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
247f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
24800 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21  IEW) */....#if !
24810 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
24820 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
24830 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
24840 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
24850 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
24860 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20   relevant WHERE 
24870 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
24880 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
24890 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52  into.** the WHER
248a0 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  E clause of subq
248b0 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  uery.  Example:.
248c0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
248d0 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
248e0 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
248f0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78  FROM t1) WHERE x
24900 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
24910 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
24920 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nto:.**.**    SE
24930 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
24940 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20  ECT a AS x, c-d 
24950 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  AS y FROM t1 WHE
24960 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31  RE a=5 AND c-d=1
24970 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20  0).**     WHERE 
24980 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
24990 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20  .** The hope is 
249a0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61  that the terms a
249b0 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65  dded to the inne
249c0 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b  r query will mak
249d0 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66  e it more.** eff
249e0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f  icient..**.** Do
249f0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69   not attempt thi
24a00 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
24a10 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28  f:.**.**   (1) (
24a20 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74  ** This restrict
24a30 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ion was removed 
24a40 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20  on 2017-09-29.  
24a50 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20  We used to.**   
24a60 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77          disallow
24a70 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
24a80 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  on for aggregate
24a90 20 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74   subqueries, but
24aa0 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
24ab0 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20    it is allowed 
24ac0 62 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65  by putting the e
24ad0 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
24ae0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
24af0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68  .**           Th
24b00 65 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63  e added HAVING c
24b10 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65  lause is pointle
24b20 73 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ss if the subque
24b30 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20  ry lacks.**     
24b40 20 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59        a GROUP BY
24b50 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75   clause.  But su
24b60 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  ch a HAVING clau
24b70 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c  se is also harml
24b80 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ess.**          
24b90 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e   so there does n
24ba0 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ot appear to be 
24bb0 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64  any reason to ad
24bc0 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a  d extra logic.**
24bd0 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75             to su
24be0 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a  ppress it. **).*
24bf0 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69  *.**   (2) The i
24c00 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
24c10 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
24c20 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62   of a common tab
24c30 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  le expression..*
24c40 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69  *.**   (3) The i
24c50 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61  nner query has a
24c60 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73   LIMIT clause (s
24c70 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73  ince the changes
24c80 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
24c90 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75         close wou
24ca0 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65  ld change the me
24cb0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d  aning of the LIM
24cc0 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  IT)..**.**   (4)
24cd0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
24ce0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
24cf0 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
24d00 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20  JOIN and the.** 
24d10 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e        expression
24d20 20 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f   to be pushed do
24d30 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  wn does not come
24d40 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
24d50 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20  use.**       on 
24d60 74 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  that LEFT JOIN..
24d70 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
24d80 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
24d90 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
24da0 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
24db0 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
24dc0 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
24dd0 4a 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72 73  JOIN where iCurs
24de0 6f 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  or is not the ri
24df0 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f  ght-hand table o
24e00 66 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  f that.**       
24e10 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65  left join.  An e
24e20 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
24e30 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
24e40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 52  .**           FR
24e50 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20  OM (SELECT 1 AS 
24e60 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  a1 UNION ALL SEL
24e70 45 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20  ECT 2) AS aa.** 
24e80 20 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28            JOIN (
24e90 53 45 4c 45 43 54 20 31 20 41 53 20 62 32 20 55  SELECT 1 AS b2 U
24ea0 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
24eb0 32 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d  2) AS bb ON (a1=
24ec0 62 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  b2).**          
24ed0 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45   LEFT JOIN (SELE
24ee0 43 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e  CT 8 AS c3 UNION
24ef0 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41   ALL SELECT 9) A
24f00 53 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a  S cc ON (b2=2);.
24f10 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  **.**       The 
24f20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 69  correct answer i
24f30 73 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28  s three rows:  (
24f40 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38  1,1,NULL),(2,2,8
24f50 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20  ),(2,2,9)..**   
24f60 20 20 20 20 42 75 74 20 69 66 20 74 68 65 20 28      But if the (
24f70 62 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20  b2=2) term were 
24f80 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77  to be pushed dow
24f90 6e 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75  n into the bb su
24fa0 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20  bquery,.**      
24fb0 20 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e   then the (1,1,N
24fc0 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62  ULL) row would b
24fd0 65 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a  e suppressed..**
24fe0 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
24ff0 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
25000 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ade and non-zero
25010 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
25020 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
25030 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63  terms are duplic
25040 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75  ated into the su
25050 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
25060 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68  c int pushDownWh
25070 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ereTerms(.  Pars
25080 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
25090 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
250a0 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29  xt (for malloc()
250b0 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72   and error repor
250c0 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63  ting) */.  Selec
250d0 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20  t *pSubq,       
250e0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
250f0 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61   whose WHERE cla
25100 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67  use is to be aug
25110 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  mented */.  Expr
25120 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
25130 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
25140 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
25150 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
25160 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t iCursor,      
25170 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
25180 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71  mber of the subq
25190 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
251a0 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20  LeftJoin        
251b0 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 71  /* True if pSubq
251c0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
251d0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
251e0 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  N */.){.  Expr *
251f0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  pNew;.  int nChn
25200 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68  g = 0;.  if( pWh
25210 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ere==0 ) return 
25220 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  0;.  if( pSubq->
25230 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
25240 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e  cursive ) return
25250 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74   0;  /* restrict
25260 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 64  ion (2) */..#ifd
25270 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
25280 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69    /* Only the fi
25290 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f  rst term of a co
252a0 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20  mpound can have 
252b0 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20  a WITH clause.  
252c0 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  But make.  ** su
252d0 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d  re no other term
252e0 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f  s are marked SF_
252f0 52 65 63 75 72 73 69 76 65 20 69 6e 20 63 61 73  Recursive in cas
25300 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e  e something chan
25310 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ges.  ** in the 
25320 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b  future..  */.  {
25330 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  .    Select *pX;
25340 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53    .    for(pX=pS
25350 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  ubq; pX; pX=pX->
25360 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61  pPrior){.      a
25370 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46  ssert( (pX->selF
25380 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
25390 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20  sive))==0 );.   
253a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
253b0 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d   if( pSubq->pLim
253c0 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  it!=0 ){.    ret
253d0 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
253e0 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d  ction (3) */.  }
253f0 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65  .  while( pWhere
25400 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
25410 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73      nChng += pus
25420 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
25430 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70  pParse, pSubq, p
25440 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20  Where->pRight,. 
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
25470 43 75 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f  Cursor, isLeftJo
25480 69 6e 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20  in);.    pWhere 
25490 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b  = pWhere->pLeft;
254a0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66  .  }.  if( isLef
254b0 74 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70  tJoin.   && (Exp
254c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68  rHasProperty(pWh
254d0 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ere,EP_FromJoin)
254e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
254f0 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f  pWhere->iRightJo
25500 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72  inTable!=iCursor
25510 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
25520 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
25530 69 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20  ion (4) */.  }. 
25540 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
25550 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46  erty(pWhere,EP_F
25560 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65  romJoin) && pWhe
25570 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  re->iRightJoinTa
25580 62 6c 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble!=iCursor ){.
25590 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
255a0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29   restriction (5)
255b0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   */.  }.  if( sq
255c0 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
255d0 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c  Constant(pWhere,
255e0 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20   iCursor) ){.   
255f0 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68   nChng++;.    wh
25600 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20  ile( pSubq ){.  
25610 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
25620 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   x;.      pNew =
25630 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
25640 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65  pParse->db, pWhe
25650 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e  re, 0);.      un
25660 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77  setJoinExpr(pNew
25670 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70  , -1);.      x.p
25680 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
25690 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
256a0 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   iCursor;.      
256b0 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43  x.iNewTable = iC
256c0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
256d0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20  sLeftJoin = 0;. 
256e0 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
256f0 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20  pSubq->pEList;. 
25700 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73       pNew = subs
25710 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b  tExpr(&x, pNew);
25720 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62 71  .      if( pSubq
25730 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
25740 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20  Aggregate ){.   
25750 20 20 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76       pSubq->pHav
25760 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
25770 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
25780 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c   pSubq->pHaving,
25790 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65   pNew);.      }e
257a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75  lse{.        pSu
257b0 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  bq->pWhere = sql
257c0 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
257d0 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70  se->db, pSubq->p
257e0 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
257f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62      }.      pSub
25800 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f  q = pSubq->pPrio
25810 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
25820 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23  eturn nChng;.}.#
25830 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
25840 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
25850 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
25860 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
25870 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
25880 54 68 65 20 70 46 75 6e 63 20 69 73 20 74 68 65  The pFunc is the
25890 20 6f 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20   only aggregate 
258a0 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  function in the 
258b0 71 75 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f  query.  Check to
258c0 20 73 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71   see.** if the q
258d0 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
258e0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
258f0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
25900 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
25910 71 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69  query is a candi
25920 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e  date for the min
25930 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f  /max optimizatio
25940 6e 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a  n, then set.** *
25950 70 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61  ppMinMax to be a
25960 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
25970 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  e to be used for
25980 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
25990 6e 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  n.** and return 
259a0 65 69 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44  either WHERE_ORD
259b0 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52  ERBY_MIN or WHER
259c0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65  E_ORDERBY_MAX de
259d0 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68  pending on.** wh
259e0 65 74 68 65 72 20 70 46 75 6e 63 20 69 73 20 61  ether pFunc is a
259f0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
25a00 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
25a10 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
25a20 6e 6f 74 20 61 20 63 61 6e 64 69 64 61 74 65 20  not a candidate 
25a30 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20  for the min/max 
25a40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65  optimization, re
25a50 74 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52  turn.** WHERE_OR
25a60 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68  DERBY_NORMAL (wh
25a70 69 63 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  ich must be zero
25a80 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
25a90 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
25aa0 6c 6c 65 64 20 61 66 74 65 72 20 61 67 67 72 65  lled after aggre
25ab0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68  gate functions h
25ac0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61  ave been.** loca
25ad0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
25ae0 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68  heir arguments h
25af0 61 76 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74  ave been subject
25b00 65 64 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a  ed to aggregate.
25b10 2a 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a  ** analysis..*/.
25b20 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
25b30 51 75 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64  Query(sqlite3 *d
25b40 62 2c 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20  b, Expr *pFunc, 
25b50 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
25b60 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
25b70 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
25b80 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a  _NORMAL;      /*
25b90 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
25ba0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
25bb0 69 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70  ist = pFunc->x.p
25bc0 4c 69 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75  List;    /* Argu
25bd0 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
25be0 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
25bf0 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20   char *zFunc;   
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72   /* Name of aggr
25c20 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70  egate function p
25c30 46 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69  Func */.  ExprLi
25c40 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20  st *pOrderBy;.  
25c50 75 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20  u8 sortOrder;.. 
25c60 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d   assert( *ppMinM
25c70 61 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ax==0 );.  asser
25c80 74 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b  t( pFunc->op==TK
25c90 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
25ca0 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
25cb0 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
25cc0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52  r!=1 ) return eR
25cd0 65 74 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46  et;.  zFunc = pF
25ce0 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  unc->u.zToken;. 
25cf0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
25d00 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
25d10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74  )==0 ){.    eRet
25d20 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
25d30 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72  _MIN;.    sortOr
25d40 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
25d50 41 53 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ASC;.  }else if(
25d60 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
25d70 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30  zFunc, "max")==0
25d80 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57   ){.    eRet = W
25d90 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
25da0 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20  ;.    sortOrder 
25db0 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  = SQLITE_SO_DESC
25dc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
25dd0 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a  eturn eRet;.  }.
25de0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f    *ppMinMax = pO
25df0 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
25e00 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
25e10 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73  pEList, 0);.  as
25e20 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
25e30 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
25e40 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
25e50 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
25e60 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  By->a[0].sortOrd
25e70 65 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a  er = sortOrder;.
25e80 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
25e90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
25ea0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
25eb0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
25ec0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
25ed0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
25ee0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
25ef0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
25f00 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
25f10 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
25f20 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
25f30 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
25f40 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
25f50 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
25f60 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
25f70 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
25f80 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
25f90 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
25fa0 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
25fb0 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
25fc0 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
25fd0 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
25fe0 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
25ff0 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
26000 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
26010 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
26020 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
26030 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
26040 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
26050 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
26060 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
26070 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
26080 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
26090 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
260a0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
260b0 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
260c0 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
260d0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
260e0 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
260f0 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
26100 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
26110 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
26120 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
26130 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
26140 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
26150 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
26160 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
26170 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
26180 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
26190 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
261a0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
261b0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
261c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
261d0 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
261e0 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
261f0 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
26200 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
26210 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
26220 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
26230 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
26240 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
26250 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
26260 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
26270 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
26280 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
26290 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
262a0 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
262b0 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
262c0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
262d0 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
262e0 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
262f0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
26300 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
26310 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
26320 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
26330 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
26340 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
26350 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
26360 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
26370 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
26380 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
26390 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
263a0 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
263b0 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
263c0 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
263d0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
263e0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
263f0 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
26400 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
26410 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
26420 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
26430 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
26440 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
26450 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
26460 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
26470 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
26480 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75  xedBy = pFrom->u
26490 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20  1.zIndexedBy;.  
264a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
264b0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
264c0 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
264d0 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
264e0 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
264f0 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42  zName, zIndexedB
26500 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  y); .        pId
26510 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
26520 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
26530 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
26540 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26550 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
26560 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65  ex: %s", zIndexe
26570 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dBy, 0);.      p
26580 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
26590 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
265a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
265b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
265c0 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  om->pIBIndex = p
265d0 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
265e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
265f0 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
26600 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
26610 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
26620 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
26630 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
26640 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
26650 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
26660 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
26670 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
26680 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
26690 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
266a0 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
266b0 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
266c0 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
266d0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
266e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
266f0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
26700 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
26710 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
26720 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
26730 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
26740 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
26750 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
26760 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
26770 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
26780 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
26790 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
267a0 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
267b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
267c0 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
267d0 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
267e0 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
267f0 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
26800 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
26810 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
26820 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
26830 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
26840 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
26850 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
26860 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
26870 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
26880 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
26890 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
268a0 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
268b0 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
268c0 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
268d0 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
268e0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
268f0 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
26900 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
26910 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
26920 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
26930 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
26940 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
26950 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
26960 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
26970 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
26980 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
26990 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
269a0 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
269b0 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
269c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
269d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
269e0 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
269f0 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
26a00 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
26a10 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
26a20 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
26a30 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
26a40 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
26a50 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
26a60 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
26a70 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
26a80 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
26a90 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
26aa0 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
26ab0 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
26ac0 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
26ad0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26ae0 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
26af0 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
26b00 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
26b10 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
26b20 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
26b30 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
26b40 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
26b50 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
26b60 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
26b70 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
26b80 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
26b90 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
26ba0 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
26bb0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
26bc0 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
26bd0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
26be0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26bf0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
26c00 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
26c10 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
26c20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
26c30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26c40 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
26c50 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
26c60 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
26c70 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
26c80 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
26c90 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
26ca0 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
26cb0 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
26cc0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
26cd0 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
26ce0 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
26cf0 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
26d00 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
26d10 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
26d20 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
26d30 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52  xpr(db, TK_ASTER
26d40 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f  ISK, 0));.  p->o
26d50 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
26d60 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
26d70 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
26d80 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48   = 0;.  pNew->pH
26d90 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65  aving = 0;.  pNe
26da0 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  w->pOrderBy = 0;
26db0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
26dc0 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  ;.  p->pNext = 0
26dd0 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30  ;.  p->pWith = 0
26de0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
26df0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
26e00 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
26e10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e  elFlags & SF_Con
26e20 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20  verted)==0 );.  
26e30 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
26e40 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61  F_Converted;.  a
26e50 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72  ssert( pNew->pPr
26e60 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  ior!=0 );.  pNew
26e70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
26e80 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
26e90 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65  pLimit = 0;.  re
26ea0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
26eb0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e;.}../*.** Chec
26ec0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
26ed0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
26ee0 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65   pFrom has table
26ef0 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
26f00 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  .** arguments.  
26f10 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76  If it does, leav
26f20 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
26f30 67 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ge in pParse and
26f40 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
26f50 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d  ero, since pFrom
26f60 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
26f70 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61  to be a table-va
26f80 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  lued function..*
26f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e  /.static int can
26fa0 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61  notBeFunction(Pa
26fb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
26fc0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26fd0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
26fe0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pFrom->fg.isTabF
26ff0 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
27000 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27010 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20  e, "'%s' is not 
27020 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72  a function", pFr
27030 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  om->zName);.    
27040 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
27050 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
27060 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27070 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  _CTE./*.** Argum
27080 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68  ent pWith (which
27090 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f   may be NULL) po
270a0 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64  ints to a linked
270b0 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20   list of nested 
270c0 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74  .** WITH context
270d0 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f  s, from inner to
270e0 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74   outermost. If t
270f0 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
27100 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20  ied by .** FROM 
27110 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70  clause element p
27120 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  Item is really a
27130 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78   common-table-ex
27140 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a  pression (CTE) .
27150 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  ** then return a
27160 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
27170 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66  CTE definition f
27180 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f  or that table. O
27190 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
271a0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
271b0 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  f a non-NULL val
271c0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
271d0 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74  set *ppContext t
271e0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57  o point to the W
271f0 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ith.** object th
27200 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
27210 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  CTE belongs to..
27220 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
27230 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68   Cte *searchWith
27240 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  (.  With *pWith,
27250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27260 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69      /* Current i
27270 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c  nnermost WITH cl
27280 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
27290 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
272a0 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f  Item,     /* FRO
272b0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
272c0 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20   to resolve */. 
272d0 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78   With **ppContex
272e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
272f0 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c   /* OUT: WITH cl
27300 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75  ause return valu
27310 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
27320 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
27330 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
27340 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
27350 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
27360 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
27370 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
27380 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
27390 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
273a0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
273b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
273c0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
273d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
273e0 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
273f0 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
27400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
27410 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20  ppContext = p;. 
27420 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27430 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  &p->a[i];.      
27440 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27450 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
27460 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65  ;.}../* The code
27470 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74   generator maint
27480 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20  ains a stack of 
27490 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75  active WITH clau
274a0 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ses.** with the 
274b0 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20  inner-most WITH 
274c0 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20  clause being at 
274d0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
274e0 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
274f0 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
27500 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20  the WITH clause 
27510 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
27520 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
27530 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66   onto the top of
27540 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61   the stack. If a
27550 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73  rgument bFree is
27560 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
27570 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20  .** WITH clause 
27580 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f  will never be po
27590 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
275a0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
275b0 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  e it.** should b
275c0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
275d0 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  th the Parse obj
275e0 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61  ect. In other ca
275f0 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72  ses, when.** bFr
27600 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20  ee==0, the With 
27610 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66  object will be f
27620 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
27630 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73  the SELECT .** s
27640 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68  tatement with wh
27650 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69  ich it is associ
27660 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
27670 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61  lite3WithPush(Pa
27680 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74  rse *pParse, Wit
27690 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72  h *pWith, u8 bFr
276a0 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62  ee){.  assert( b
276b0 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72  Free==0 || (pPar
276c0 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20  se->pWith==0 && 
276d0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
276e0 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  ree==0) );.  if(
276f0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73   pWith ){.    as
27700 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
27710 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith!=pWith );.  
27720 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
27730 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
27740 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
27750 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
27760 69 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72  if( bFree ) pPar
27770 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20  se->pWithToFree 
27780 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a  = pWith;.  }.}..
27790 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
277a0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72  ion checks if ar
277b0 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66  gument pFrom ref
277c0 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63  ers to a CTE dec
277d0 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57  lared by .** a W
277e0 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ITH clause on th
277f0 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c  e stack currentl
27800 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  y maintained by 
27810 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c  the parser. And,
27820 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79  .** if currently
27830 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54   processing a CT
27840 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66  E expression, if
27850 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69   it is a recursi
27860 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ve.** reference 
27870 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43  to the current C
27880 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  TE..**.** If pFr
27890 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69  om falls into ei
278a0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
278b0 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65  categories above
278c0 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a  , pFrom->pTab.**
278d0 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
278e0 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
278f0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65  accordingly. The
27900 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
27910 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e  heck.** (pFrom->
27920 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65  pTab!=0) to dete
27930 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
27940 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75   not a successfu
27950 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66  l match.** was f
27960 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ound..**.** Whet
27970 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74  her or not a mat
27980 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c  ch is found, SQL
27990 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
279a0 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a  ed if no error.*
279b0 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  * occurs. If an 
279c0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
279d0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
279e0 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
279f0 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e  the.** parser an
27a00 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64  d some error cod
27a10 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
27a20 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
27a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27a40 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c  ithExpand(.  Wal
27a50 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20  ker *pWalker, . 
27a60 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27a70 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20  item *pFrom.){. 
27a80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
27a90 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
27aa0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
27ab0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
27ac0 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
27ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ae0 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28  /* Matched CTE (
27af0 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61  or NULL if no ma
27b00 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a  tch) */.  With *
27b10 70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  pWith;          
27b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54            /* WIT
27b30 48 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43  H clause that pC
27b40 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  te belongs to */
27b50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ..  assert( pFro
27b60 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20  m->pTab==0 );.. 
27b70 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69   pCte = searchWi
27b80 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  th(pParse->pWith
27b90 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29  , pFrom, &pWith)
27ba0 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a  ;.  if( pCte ){.
27bb0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
27bc0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
27bd0 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63  EList;.    Selec
27be0 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c  t *pSel;.    Sel
27bf0 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ect *pLeft;     
27c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
27c10 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ft-most SELECT s
27c20 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
27c30 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76  int bMayRecursiv
27c40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
27c50 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e   True if compoun
27c60 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f  d joined by UNIO
27c70 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57  N [ALL] */.    W
27c80 69 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b  ith *pSavedWith;
27c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27ca0 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
27cb0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a   pParse->pWith *
27cc0 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74  /..    /* If pCt
27cd0 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f  e->zCteErr is no
27ce0 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  n-NULL at this p
27cf0 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  oint, then this 
27d00 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20  is an illegal.  
27d10 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72    ** recursive r
27d20 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20  eference to CTE 
27d30 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65  pCte. Leave an e
27d40 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61  rror in pParse a
27d50 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
27d60 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d   early. If pCte-
27d70 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c  >zCteErr is NULL
27d80 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e  , then this is n
27d90 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72  ot a recursive r
27da0 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a  eference..    **
27db0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70   In this case, p
27dc0 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  roceed.  */.    
27dd0 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72  if( pCte->zCteEr
27de0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
27df0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27e00 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  e, pCte->zCteErr
27e10 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
27e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27e30 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
27e40 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42  .    if( cannotB
27e50 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
27e60 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
27e70 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
27e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
27e90 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
27ea0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
27eb0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
27ec0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
27ed0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
27ee0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
27ef0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
27f00 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54  rt;.    pTab->nT
27f10 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  abRef = 1;.    p
27f20 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
27f30 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
27f40 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
27f50 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
27f60 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
27f70 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
27f80 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
27f90 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
27fa0 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
27fb0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
27fc0 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f  _Ephemeral | TF_
27fd0 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
27fe0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
27ff0 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
28000 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
28010 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
28020 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
28030 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
28040 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
28050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
28060 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  rom->pSelect );.
28070 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
28080 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72   this is a recur
28090 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20  sive CTE. */.   
280a0 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70   pSel = pFrom->p
280b0 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79  Select;.    bMay
280c0 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53  Recursive = ( pS
280d0 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  el->op==TK_ALL |
280e0 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55  | pSel->op==TK_U
280f0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  NION );.    if( 
28100 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
28110 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
28120 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
28130 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  c = pFrom->pSele
28140 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  ct->pSrc;.      
28150 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
28160 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
28170 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
28180 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
28190 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  = &pSrc->a[i];. 
281a0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
281b0 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a  ->zDatabase==0 .
281c0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
281d0 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20  m->zName!=0 .   
281e0 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
281f0 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d  te3StrICmp(pItem
28200 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a  ->zName, pCte->z
28210 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20  Name).          
28220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
28230 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  em->pTab = pTab;
28240 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
28250 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
28260 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
28270 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
28280 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d  .          pSel-
28290 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
282a0 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20  Recursive;.     
282b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
282c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
282d0 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65  one recursive re
282e0 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69  ference is permi
282f0 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66  tted. */ .    if
28300 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
28310 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
28320 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20  e3ErrorMsg(.    
28330 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d        pParse, "m
28340 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63  ultiple referenc
28350 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20  es to recursive 
28360 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65  table: %s", pCte
28370 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
28380 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
28390 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
283a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  }.    assert( pT
283b0 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c  ab->nTabRef==1 |
283c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
283d0 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26  (pSel->selFlags&
283e0 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
283f0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d   pTab->nTabRef==
28400 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d  2 ));..    pCte-
28410 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63  >zCteErr = "circ
28420 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20  ular reference: 
28430 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57  %s";.    pSavedW
28440 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ith = pParse->pW
28450 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
28460 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
28470 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
28480 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53  rsive ){.      S
28490 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
284a0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
284b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
284c0 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a  or->pWith==0 );.
284d0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57        pPrior->pW
284e0 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74  ith = pSel->pWit
284f0 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  h;.      sqlite3
28500 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
28510 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20  er, pPrior);.   
28520 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68     pPrior->pWith
28530 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
28540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
28550 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
28560 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pSel);.    }. 
28570 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
28580 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66   = pWith;..    f
28590 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70  or(pLeft=pSel; p
285a0 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c  Left->pPrior; pL
285b0 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f  eft=pLeft->pPrio
285c0 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  r);.    pEList =
285d0 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a   pLeft->pEList;.
285e0 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43      if( pCte->pC
285f0 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ols ){.      if(
28600 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
28610 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e  t->nExpr!=pCte->
28620 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a  pCols->nExpr ){.
28630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28640 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28650 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64  "table %s has %d
28660 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63   values for %d c
28670 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20  olumns",.       
28680 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65       pCte->zName
28690 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
286a0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45   pCte->pCols->nE
286b0 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  xpr.        );. 
286c0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
286d0 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
286e0 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  h;.        retur
286f0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
28700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
28710 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f  List = pCte->pCo
28720 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ls;.    }..    s
28730 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
28740 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
28750 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  , pEList, &pTab-
28760 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
28770 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  ol);.    if( bMa
28780 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
28790 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65      if( pSel->se
287a0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
287b0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  rsive ){.       
287c0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
287d0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72   "multiple recur
287e0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a  sive references:
287f0 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73   %s";.      }els
28800 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  e{.        pCte-
28810 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75  >zCteErr = "recu
28820 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
28830 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25  in a subquery: %
28840 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s";.      }.    
28850 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
28860 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
28870 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  l);.    }.    pC
28880 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b  te->zCteErr = 0;
28890 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
288a0 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
288b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
288c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
288d0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
288e0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
288f0 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
28900 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
28910 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61  cond argument ha
28920 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  s an associated 
28930 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c  WITH .** clause,
28940 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65   pop it from the
28950 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73   stack stored as
28960 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72   part of the Par
28970 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  se object..**.**
28980 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
28990 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53  s used as the xS
289a0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29  electCallback2()
289b0 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20   callback by.** 
289c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
289d0 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69  and() when walki
289e0 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65  ng a SELECT tree
289f0 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c   to resolve tabl
28a00 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f  e.** names and o
28a10 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
28a20 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73   elements. .*/.s
28a30 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
28a40 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20  tPopWith(Walker 
28a50 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
28a60 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
28a70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
28a80 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f  >pParse;.  if( O
28a90 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45  K_IF_ALWAYS_TRUE
28aa0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20  (pParse->pWith) 
28ab0 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  && p->pPrior==0 
28ac0 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69  ){.    With *pWi
28ad0 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f  th = findRightmo
28ae0 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20  st(p)->pWith;.  
28af0 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29    if( pWith!=0 )
28b00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28b10 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
28b20 57 69 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50  With );.      pP
28b30 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
28b40 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  ith->pOuter;.   
28b50 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
28b60 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70  define selectPop
28b70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  With 0.#endif../
28b80 2a 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  *.** The SrcList
28b90 5f 69 74 65 6d 20 73 74 72 75 63 74 75 72 65 20  _item structure 
28ba0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
28bb0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 72 65  cond argument re
28bc0 70 72 65 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75  presents a.** su
28bd0 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
28be0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
28bf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28c00 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
28c10 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  ** allocates and
28c20 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 53   populates the S
28c30 72 63 4c 69 73 74 5f 69 74 65 6d 2e 70 54 61 62  rcList_item.pTab
28c40 20 6f 62 6a 65 63 74 2e 20 49 66 20 73 75 63 63   object. If succ
28c50 65 73 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54  essful,.** SQLIT
28c60 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
28c70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
28c80 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
28c90 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
28ca0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
28cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 61  .int sqlite3Expa
28cc0 6e 64 53 75 62 71 75 65 72 79 28 50 61 72 73 65  ndSubquery(Parse
28cd0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
28ce0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
28cf0 46 72 6f 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20  From){.  Select 
28d00 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
28d10 53 65 6c 65 63 74 3b 0a 20 20 54 61 62 6c 65 20  Select;.  Table 
28d20 2a 70 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74  *pTab;..  assert
28d30 28 20 70 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f  ( pSel );.  pFro
28d40 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
28d50 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
28d60 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
28d70 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
28d80 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
28d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
28da0 4f 4d 45 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  OMEM;.  pTab->nT
28db0 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28  abRef = 1;.  if(
28dc0 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29   pFrom->zAlias )
28dd0 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  {.    pTab->zNam
28de0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
28df0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
28e00 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pFrom->zAlias);.
28e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
28e20 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
28e30 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
28e40 2d 3e 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f  ->db, "subquery_
28e50 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  %p", (void*)pTab
28e60 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
28e70 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
28e80 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
28e90 69 6f 72 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33  ior; }.  sqlite3
28ea0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
28eb0 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
28ec0 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e  ->pEList,&pTab->
28ed0 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c  nCol,&pTab->aCol
28ee0 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
28ef0 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e   = -1;.  pTab->n
28f00 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
28f10 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
28f20 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
28f30 35 37 36 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e  576) );.  pTab->
28f40 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
28f50 70 68 65 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74  phemeral;..  ret
28f60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28f70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28f80 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72  tine is a Walker
28f90 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65   callback for "e
28fa0 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45  xpanding" a SELE
28fb0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
28fc0 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61   "Expanding" mea
28fd0 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c  ns to do the fol
28fe0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
28ff0 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
29000 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
29010 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
29020 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
29030 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
29040 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
29050 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
29060 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
29070 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
29080 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
29090 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
290a0 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
290b0 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
290c0 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
290d0 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
290e0 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
290f0 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
29100 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
29110 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
29120 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29130 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
29140 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
29150 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
29160 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
29170 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
29180 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
29190 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
291a0 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
291b0 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
291c0 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
291d0 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
291e0 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
291f0 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  up the persisten
29200 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
29210 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
29220 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
29230 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
29240 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
29250 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ause to accommod
29260 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
29270 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
29280 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
29290 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
292a0 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
292b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
292c0 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
292d0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
292e0 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
292f0 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
29300 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
29310 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
29320 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
29330 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
29340 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
29350 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
29360 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
29370 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
29380 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
29390 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
293a0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
293b0 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
293c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
293d0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
293e0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
293f0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
29400 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
29410 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
29420 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
29430 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
29440 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
29450 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
29460 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
29470 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
29480 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
29490 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
294a0 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
294b0 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
294c0 73 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20  selFlags;.  u32 
294d0 65 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a  elistFlags = 0;.
294e0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
294f0 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
29500 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
29510 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
29520 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
29530 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
29540 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66  >pSrc!=0 );.  if
29550 28 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  ( (selFlags & SF
29560 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
29570 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
29580 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
29590 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
295a0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
295b0 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  EList;.  sqlite3
295c0 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c  WithPush(pParse,
295d0 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a   p->pWith, 0);..
295e0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
295f0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
29600 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
29610 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
29620 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
29630 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
29640 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
29650 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
29660 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
29670 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
29680 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
29690 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
296a0 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
296b0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
296c0 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
296d0 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
296e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
296f0 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
29700 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
29710 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
29720 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
29730 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
29740 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
29750 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
29760 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
29770 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
29780 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
29790 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
297a0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
297b0 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
297c0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
297d0 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f  rsive==0 || pFro
297e0 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  m->pTab!=0 );.  
297f0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
29800 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
29810 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
29820 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
29830 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
29840 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
29850 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
29860 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
29870 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
29880 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
29890 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
298a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
298b0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
298c0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
298d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
298e0 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
298f0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
29900 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
29910 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
29920 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
29930 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
29940 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
29950 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
29960 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
29970 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
29980 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29990 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
299a0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
299b0 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
299c0 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
299d0 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 46  query(pParse, pF
299e0 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
299f0 43 5f 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a  C_Abort;.#endif.
29a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29a10 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
29a20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
29a30 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
29a40 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
29a50 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
29a60 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
29a70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
29a80 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
29a90 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
29aa0 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
29ab0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
29ac0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
29ad0 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
29ae0 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66  ab->nTabRef>=0xf
29af0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
29b00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
29b10 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
29b20 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
29b30 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
29b40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
29b50 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
29b60 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
29b70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
29b80 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
29ba0 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
29bb0 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
29bc0 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e  al(pTab) && cann
29bd0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
29be0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
29bf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
29c00 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
29c10 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
29c20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
29c30 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
29c40 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
29c50 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
29c60 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
29c70 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
29c80 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  t ){.        i16
29c90 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
29ca0 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
29cb0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
29cc0 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
29cd0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29ce0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29cf0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
29d00 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
29d10 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
29d20 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
29d30 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
29d40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
29d50 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
29d60 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  e(pFrom->pSelect
29d70 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
29d80 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
29d90 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
29da0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
29db0 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -1;.        sqli
29dc0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
29dd0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
29de0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
29df0 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
29e00 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
29e10 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
29e20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
29e30 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
29e40 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
29e50 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
29e60 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
29e70 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
29e80 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
29e90 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
29ea0 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
29eb0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
29ec0 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
29ed0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
29ee0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
29ef0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
29f00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
29f10 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
29f20 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
29f30 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
29f40 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
29f50 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
29f60 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
29f70 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
29f80 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
29f90 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
29fa0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
29fb0 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
29fc0 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
29fd0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
29fe0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
29ff0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
2a000 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
2a010 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
2a020 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
2a030 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65   TK_ASTERISK ope
2a040 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
2a050 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
2a060 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   in the column. 
2a070 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66   ** list.  The f
2a080 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
2a090 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
2a0a0 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
2a0b0 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
2a0c0 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63  s and expand eac
2a0d0 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
2a0e0 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
2a0f0 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62   in.  ** all tab
2a100 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
2a110 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
2a120 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
2a130 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2a140 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
2a150 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
2a160 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
2a170 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
2a180 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
2a190 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
2a1a0 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
2a1b0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2a1c0 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
2a1d0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
2a1e0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
2a1f0 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
2a200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
2a210 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
2a220 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
2a230 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
2a240 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
2a250 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
2a260 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
2a270 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
2a280 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69  ) break;.    eli
2a290 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
2a2a0 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
2a2b0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
2a2c0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2a2d0 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
2a2e0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
2a2f0 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
2a300 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
2a310 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
2a320 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
2a330 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
2a340 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
2a350 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2a360 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
2a370 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
2a380 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
2a390 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
2a3a0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2a3b0 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
2a3c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
2a3d0 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
2a3e0 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
2a3f0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
2a400 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
2a410 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
2a420 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a440 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
2a450 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
2a460 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
2a470 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
2a480 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
2a490 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
2a4a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69  pExpr;.      eli
2a4b0 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
2a4c0 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67  lags;.      pRig
2a4d0 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
2a4e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a4f0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
2a500 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2a510 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
2a520 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
2a530 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
2a540 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
2a550 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
2a560 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2a570 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
2a580 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
2a590 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2a5a0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
2a5b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a5c0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2a5d0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
2a5e0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
2a5f0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2a600 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
2a610 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
2a620 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
2a630 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
2a640 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
2a650 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
2a660 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
2a670 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
2a680 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
2a690 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
2a6a0 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
2a6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
2a6c0 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
2a6d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a6e0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
2a6f0 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
2a700 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
2a710 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
2a720 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
2a730 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
2a740 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
2a750 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
2a760 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
2a770 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
2a780 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
2a790 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
2a7a0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
2a7b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2a7c0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
2a7d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2a7e0 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
2a7f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
2a800 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2a810 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
2a820 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
2a830 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
2a840 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
2a850 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
2a860 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
2a870 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
2a880 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
2a890 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2a8a0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
2a8b0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
2a8c0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
2a8d0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
2a8e0 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
2a8f0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
2a900 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
2a910 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
2a920 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
2a930 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
2a940 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
2a950 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
2a960 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
2a970 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2a980 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
2a990 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
2a9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a9b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2a9c0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
2a9d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2a9e0 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
2a9f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
2aa00 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
2aa20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2aa30 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
2aa40 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2aa50 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
2aa60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2aa70 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2aa80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2aa90 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
2aaa0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2aab0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
2aac0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
2aad0 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
2aae0 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
2aaf0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
2ab00 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
2ab10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
2ab20 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
2ab30 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
2ab40 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2ab50 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
2ab60 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2ab70 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
2ab80 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
2ab90 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
2aba0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
2abb0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
2abc0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
2abd0 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
2abe0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
2ac00 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
2ac10 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
2ac20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
2ac30 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
2ac40 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
2ac50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ac60 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2ac80 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
2ac90 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
2aca0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
2acb0 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2ace0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2acf0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
2ad00 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
2ad10 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
2ad20 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
2ad30 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
2ad40 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
2ad50 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
2ad60 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
2ad70 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
2ad80 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
2ad90 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
2ada0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
2adb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2adc0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2add0 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
2ade0 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
2adf0 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
2ae00 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
2ae10 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
2ae20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2ae30 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2ae40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ae50 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
2ae60 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
2ae70 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
2ae80 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
2ae90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2aea0 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
2aeb0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
2aec0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2aed0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
2aee0 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
2aef0 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
2af00 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
2af10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2af20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
2af30 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
2af40 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
2af50 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
2af60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
2af70 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
2af80 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afa0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2afb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2afc0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2afd0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
2afe0 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
2aff0 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
2b000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b010 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
2b020 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
2b030 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
2b040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b050 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
2b060 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2b070 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
2b080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b090 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2b0a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b0b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b0c0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
2b0d0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2b0e0 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
2b0f0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
2b100 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
2b110 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
2b120 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2b130 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
2b140 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
2b150 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2b160 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
2b180 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
2b190 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
2b1a0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
2b1b0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
2b1c0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2b1d0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
2b1e0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
2b1f0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
2b200 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
2b210 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2b220 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2b230 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
2b240 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
2b250 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2b260 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2b270 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2b280 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
2b290 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b2a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
2b2b0 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2b2d0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
2b2e0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
2b2f0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
2b300 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2b310 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
2b320 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
2b330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b350 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2b360 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
2b370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b380 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2b390 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2b3a0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
2b3b0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2b3c0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
2b3d0 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
2b3e0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
2b3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b400 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
2b410 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
2b420 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
2b430 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
2b440 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2b450 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
2b460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b470 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2b480 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
2b490 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2b4a0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
2b4b0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
2b4c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b4d0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
2b4e0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
2b4f0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2b500 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2b520 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
2b530 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2b540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b550 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2b560 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
2b570 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
2b580 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
2b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5b0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
2b5c0 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
2b5d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2b5e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2b5f0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
2b600 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b610 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2b620 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
2b630 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b650 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
2b660 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
2b670 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b680 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
2b690 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2b6a0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
2b6b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b6c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b6d0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2b6e0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
2b6f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2b700 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2b710 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2b720 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
2b730 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
2b740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b750 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2b760 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2b770 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2b780 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
2b790 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
2b7a0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  }.  if( p->pELis
2b7b0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  t ){.    if( p->
2b7c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
2b7d0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
2b7e0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
2b7f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2b800 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2b810 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
2b820 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
2b830 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2b840 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
2b850 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c      if( (elistFl
2b860 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e  ags & (EP_HasFun
2b870 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29 21  c|EP_Subquery))!
2b880 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
2b890 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f  elFlags |= SF_Co
2b8a0 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20  mplexResult;.   
2b8b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2b8c0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2b8d0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2b8e0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2b8f0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
2b900 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2b910 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
2b920 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2b930 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
2b940 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
2b950 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
2b960 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
2b970 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
2b980 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
2b990 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
2b9a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2b9b0 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
2b9c0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
2b9d0 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
2b9e0 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
2b9f0 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
2ba00 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
2ba10 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
2ba20 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
2ba30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ba40 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  ExprWalkNoop(Wal
2ba50 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
2ba60 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
2ba70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ba80 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2ba90 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
2baa0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2bab0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2bac0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2bad0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66  se-tree walker f
2bae0 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
2baf0 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72  ents..** subquer
2bb00 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
2bb10 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
2bb20 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
2bb30 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
2bb40 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
2bb50 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2bb60 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2bb70 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2bb80 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2bb90 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  inue;.}..#if SQL
2bba0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2bbb0 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20 20  Always assert.  
2bbc0 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c  This xSelectCall
2bbd0 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61  back2 implementa
2bbe0 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74  tion proves that
2bbf0 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43   the.** xSelectC
2bc00 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65  allback2 is neve
2bc10 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f  r invoked..*/.vo
2bc20 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2bc30 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b  WalkAssert2(Walk
2bc40 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
2bc50 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
2bc60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2bc70 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2bc80 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74  Used2);.  assert
2bc90 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ( 0 );.}.#endif.
2bca0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2bcb0 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
2bcc0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2bcd0 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
2bce0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
2bcf0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2bd00 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
2bd10 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
2bd20 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
2bd30 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
2bd40 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
2bd50 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
2bd60 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
2bd70 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
2bd80 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
2bd90 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
2bda0 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
2bdb0 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
2bdc0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2bdd0 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
2bde0 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
2bdf0 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
2be00 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
2be10 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
2be20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
2be30 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
2be40 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2be50 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2be60 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
2be70 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2be80 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
2be90 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
2bea0 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
2beb0 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
2bec0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2bed0 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
2bee0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2bef0 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
2bf00 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2bf10 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
2bf20 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2bf30 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2bf40 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
2bf50 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
2bf60 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
2bf70 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
2bf80 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29  se->hasCompound)
2bf90 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
2bfa0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
2bfb0 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
2bfc0 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
2bfd0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2bfe0 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ck2 = 0;.    sql
2bff0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2c000 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
2c010 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2c020 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
2c030 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
2c040 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2c050 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
2c060 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2c070 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
2c080 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2c090 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2c0a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
2c0b0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2c0c0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
2c0d0 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
2c0e0 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
2c0f0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
2c100 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
2c110 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2c120 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
2c130 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
2c140 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
2c150 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
2c160 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2c170 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2c180 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
2c190 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
2c1a0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
2c1b0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
2c1c0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
2c1d0 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
2c1e0 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
2c1f0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
2c200 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
2c210 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
2c220 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
2c230 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
2c240 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
2c250 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
2c260 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
2c270 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2c280 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
2c290 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
2c2a0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
2c2b0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
2c2c0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
2c2d0 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
2c2e0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2c2f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2c300 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
2c310 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
2c320 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2c330 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
2c340 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
2c350 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
2c360 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  d );.  if( p->se
2c370 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
2c380 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
2c390 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
2c3a0 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
2c3b0 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
2c3c0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
2c3d0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2c3e0 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
2c3f0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
2c400 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
2c410 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
2c420 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2c430 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
2c440 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2c450 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
2c460 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2c470 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2c480 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
2c490 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
2c4a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2c4b0 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
2c4c0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
2c4d0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
2c4e0 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
2c4f0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
2c500 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
2c510 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
2c520 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
2c530 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2c540 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
2c550 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
2c560 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
2c570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2c580 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2c590 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
2c5a0 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
2c5b0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2c5c0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
2c5d0 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
2c5e0 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
2c5f0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2c600 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
2c610 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2c620 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
2c630 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
2c640 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
2c650 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2c660 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
2c670 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
2c680 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2c690 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
2c6a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2c6b0 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
2c6c0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2c6d0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
2c6e0 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
2c6f0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c700 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
2c710 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
2c720 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2c730 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
2c740 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
2c750 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2c760 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2c770 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2c780 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2c790 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
2c7a0 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
2c7b0 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
2c7c0 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
2c7d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
2c7e0 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
2c7f0 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
2c800 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
2c810 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
2c820 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
2c830 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
2c840 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
2c850 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
2c860 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
2c870 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
2c880 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
2c890 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2c8a0 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
2c8b0 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
2c8c0 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
2c8d0 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
2c8e0 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
2c8f0 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
2c900 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
2c910 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
2c920 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
2c930 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
2c940 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2c950 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
2c960 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
2c970 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
2c980 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
2c990 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
2c9a0 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
2c9b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2c9c0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2c9d0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2c9e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2c9f0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2ca00 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2ca10 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
2ca20 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
2ca30 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2ca40 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
2ca50 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
2ca60 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
2ca70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ca80 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2ca90 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2caa0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
2cab0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2cac0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
2cad0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
2cae0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
2caf0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
2cb00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2cb10 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2cb20 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2cb30 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
2cb40 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
2cb50 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
2cb60 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
2cb70 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
2cb80 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2cb90 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2cba0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2cbb0 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
2cbc0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
2cbd0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
2cbe0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
2cbf0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
2cc00 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2cc10 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
2cc20 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
2cc30 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
2cc40 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
2cc50 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
2cc60 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
2cc70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
2cc80 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
2cc90 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
2cca0 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
2ccb0 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
2ccc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2ccd0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
2cce0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2ccf0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2cd00 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2cd10 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2cd20 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2cd30 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
2cd40 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
2cd50 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
2cd60 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
2cd70 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
2cd80 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
2cd90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2cda0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2cdb0 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
2cdc0 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
2cdd0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
2cde0 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
2cdf0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
2ce00 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
2ce10 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
2ce20 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
2ce30 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
2ce40 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2ce50 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
2ce60 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
2ce70 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2ce80 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
2ce90 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2cea0 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2ceb0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2cec0 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
2ced0 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
2cee0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2cef0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2cf00 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2cf10 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
2cf20 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2cf30 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2cf40 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2cf50 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2cf60 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
2cf70 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
2cf80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2cf90 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
2cfa0 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
2cfb0 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
2cfc0 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
2cfd0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
2cfe0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2cff0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
2d000 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
2d010 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2d020 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2d030 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
2d040 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2d050 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
2d060 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2d070 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
2d080 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
2d090 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
2d0a0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
2d0b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2d0c0 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
2d0d0 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
2d0e0 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
2d0f0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
2d100 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
2d110 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
2d120 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2d130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
2d140 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2d150 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
2d160 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2d170 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73  arse, pE->x.pLis
2d180 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  t,0,0);.        
2d190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d1a0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2d1b0 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
2d1c0 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2d1f0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2d200 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
2d210 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2d220 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
2d230 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
2d240 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
2d250 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
2d260 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
2d270 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
2d280 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
2d290 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
2d2a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2d2b0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2d2c0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2d2d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2d2e0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2d2f0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2d300 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
2d310 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
2d320 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2d330 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
2d340 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2d350 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2d360 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2d370 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2d380 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2d390 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2d3a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2d3b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d3c0 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
2d3d0 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
2d3e0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
2d3f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2d400 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46  pendP4(v, pF->pF
2d410 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
2d420 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
2d430 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
2d440 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
2d450 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
2d460 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
2d470 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
2d480 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  sor position..**
2d490 0a 2a 2a 20 49 66 20 72 65 67 41 63 63 20 69 73  .** If regAcc is
2d4a0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
2d4b0 65 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e 28 29  ere are no min()
2d4c0 20 6f 72 20 6d 61 78 28 29 20 61 67 67 72 65 67   or max() aggreg
2d4d0 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67 67 49  ates.** in pAggI
2d4e0 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 70  nfo, then only p
2d4f0 6f 70 75 6c 61 74 65 20 74 68 65 20 70 41 67 67  opulate the pAgg
2d500 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2d510 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 2a  or accumulator.*
2d520 2a 20 72 65 67 69 73 74 65 72 73 20 69 20 72 65  * registers i re
2d530 67 69 73 74 65 72 20 72 65 67 41 63 63 20 63 6f  gister regAcc co
2d540 6e 74 61 69 6e 73 20 30 2e 20 54 68 65 20 63 61  ntains 0. The ca
2d550 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b 65 20 63  ller will take c
2d560 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74 74 69 6e  are.** of settin
2d570 67 20 61 6e 64 20 63 6c 65 61 72 69 6e 67 20 72  g and clearing r
2d580 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  egAcc..*/.static
2d590 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
2d5a0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
2d5b0 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 41 63  Parse, int regAc
2d5c0 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  c, AggInfo *pAgg
2d5d0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2d5e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2d5f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2d600 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
2d610 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
2d620 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
2d630 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2d640 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2d650 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
2d660 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2d670 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
2d680 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2d690 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2d6a0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2d6b0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
2d6c0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
2d6d0 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
2d6e0 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
2d6f0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2d700 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2d710 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2d720 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2d730 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2d740 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
2d750 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2d760 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
2d770 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67  nExpr;.      reg
2d780 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Agg = sqlite3Get
2d790 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2d7a0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73  , nArg);.      s
2d7b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2d7c0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2d7d0 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c  List, regAgg, 0,
2d7e0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
2d7f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d800 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
2d810 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
2d820 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2d830 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
2d840 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
2d850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2d860 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2d870 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
2d880 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72  ==0 );  /* Error
2d890 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20   condition */.  
2d8a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2d8b0 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73  rg>1 );   /* Als
2d8c0 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  o an error */.  
2d8d0 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
2d8e0 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
2d8f0 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
2d900 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
2d910 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
2d920 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
2d930 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
2d940 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
2d950 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
2d960 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
2d970 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2d980 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
2d990 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
2d9a0 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
2d9b0 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
2d9c0 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
2d9d0 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
2d9e0 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
2d9f0 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
2da00 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
2da10 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2da20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2da30 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2da40 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
2da50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2da60 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
2da70 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
2da80 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
2da90 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
2daa0 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
2dab0 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
2dac0 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
2dad0 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
2dae0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2daf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2db00 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
2db10 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
2db20 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
2db30 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
2db40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2db50 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
2db60 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  p0, 0, regAgg, p
2db70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71  F->iMem);.    sq
2db80 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
2db90 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20  4(v, pF->pFunc, 
2dba0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
2dbb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2dbc0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
2dbd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2dbe0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
2dbf0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
2dc00 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2dc10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2dc20 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2dc30 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
2dc40 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
2dc50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2dc60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2dc70 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
2dc80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2dc90 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2dca0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
2dcb0 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
2dcc0 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
2dcd0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2dce0 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
2dcf0 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
2dd00 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
2dd10 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
2dd20 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
2dd30 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
2dd40 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
2dd50 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
2dd60 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
2dd70 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
2dd80 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
2dd90 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
2dda0 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
2ddb0 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
2ddc0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
2ddd0 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
2dde0 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
2ddf0 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
2de00 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
2de10 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
2de20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
2de30 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
2de40 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
2de50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
2de60 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
2de70 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
2de80 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
2de90 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
2dea0 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
2deb0 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
2dec0 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
2ded0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
2dee0 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20 20 20  cumulator ){.   
2def0 20 72 65 67 48 69 74 20 3d 20 72 65 67 41 63 63   regHit = regAcc
2df00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 48  ;.  }.  if( regH
2df10 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
2df20 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
2df30 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2df40 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62  If, regHit); Vdb
2df50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2df60 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
2df70 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2df80 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
2df90 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
2dfa0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
2dfb0 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
2dfc0 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
2dfd0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2dfe0 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
2dff0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
2e000 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2e010 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
2e020 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2e030 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2e040 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
2e050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2e060 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
2e070 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
2e080 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
2e090 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
2e0a0 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
2e0b0 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
2e0c0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
2e0d0 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
2e0e0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2e0f0 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
2e100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e110 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
2e120 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
2e130 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
2e140 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2e150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e160 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
2e170 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e190 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
2e1a0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
2e1b0 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e1d0 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
2e1e0 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
2e1f0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
2e200 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
2e210 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
2e220 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
2e230 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
2e240 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
2e250 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
2e260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2e270 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65  beExplain(pParse
2e280 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45  , 0, "SCAN TABLE
2e290 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20   %s%s%s",.      
2e2a0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
2e2b0 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
2e2c0 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  " USING COVERING
2e2d0 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
2e2e0 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
2e2f0 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
2e300 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
2e310 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
2e320 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2e330 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
2e340 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
2e350 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
2e360 75 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f  used by havingTo
2e370 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Where()..**.** I
2e380 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65  f the node passe
2e390 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  d to the callbac
2e3a0 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f  k is a TK_AND no
2e3b0 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57  de, return .** W
2e3c0 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  RC_Continue to t
2e3d0 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ell sqlite3WalkE
2e3e0 78 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65  xpr() to iterate
2e3f0 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e   through child n
2e400 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  odes..**.** Othe
2e410 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52  rwise, return WR
2e420 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73  C_Prune. In this
2e430 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63   case, also chec
2e440 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62  k if the .** sub
2e450 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63  -expression matc
2e460 68 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61  hes the criteria
2e470 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64   for being moved
2e480 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
2e490 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20   clause. If so, 
2e4a0 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48  add it to the WH
2e4b0 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72  ERE clause and r
2e4c0 65 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65  eplace the sub-e
2e4d0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74  xpression.** wit
2e4e0 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65  hin the HAVING e
2e4f0 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61  xpression with a
2e500 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a   constant "1"..*
2e510 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76  /.static int hav
2e520 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62  ingToWhereExprCb
2e530 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2e540 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2e550 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2e560 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53  =TK_AND ){.    S
2e570 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c  elect *pS = pWal
2e580 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a  ker->u.pSelect;.
2e590 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2e5a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
2e5b0 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e  roupBy(pWalker->
2e5c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
2e5d0 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a  S->pGroupBy) ){.
2e5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2e5f0 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  b = pWalker->pPa
2e600 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45  rse->db;.      E
2e610 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
2e620 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
2e630 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
2e640 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
2e650 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
2e660 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
2e670 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20   Expr *pWhere = 
2e680 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  pS->pWhere;.    
2e690 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a      SWAP(Expr, *
2e6a0 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20  pNew, *pExpr);. 
2e6b0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2e6c0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2e6d0 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a   pWhere, pNew);.
2e6e0 20 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65          pS->pWhe
2e6f0 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  re = pNew;.     
2e700 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2e710 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
2e720 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2e730 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
2e740 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2e750 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
2e760 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65  ransfer eligible
2e770 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
2e780 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66  HAVING clause of
2e790 20 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20   a query, which 
2e7a0 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20  is.** processed 
2e7b0 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20  after grouping, 
2e7c0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2e7d0 75 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72  use, which is pr
2e7e0 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a  ocessed before.*
2e7f0 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20  * grouping. For 
2e800 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65  example, the que
2e810 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
2e820 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
2e830 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f  s> WHERE a=? GRO
2e840 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62  UP BY b HAVING b
2e850 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a  =? AND c=?.**.**
2e860 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
2e870 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  n as:.**.**   SE
2e880 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
2e890 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41  les> WHERE a=? A
2e8a0 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20  ND b=? GROUP BY 
2e8b0 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a  b HAVING c=?.**.
2e8c0 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  ** A term of the
2e8d0 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69   HAVING expressi
2e8e0 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66  on is eligible f
2e8f0 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69  or transfer if i
2e900 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e  t consists.** en
2e910 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61  tirely of consta
2e920 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69  nts and expressi
2e930 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  ons that are als
2e940 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  o GROUP BY terms
2e950 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65   that.** use the
2e960 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74   "BINARY" collat
2e970 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ion sequence..*/
2e980 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76  .static void hav
2e990 69 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65  ingToWhere(Parse
2e9a0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2e9b0 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73   *p){.  Walker s
2e9c0 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74  Walker;.  memset
2e9d0 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69  (&sWalker, 0, si
2e9e0 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a  zeof(sWalker));.
2e9f0 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65    sWalker.pParse
2ea00 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61   = pParse;.  sWa
2ea10 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
2ea20 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65  ck = havingToWhe
2ea30 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c  reExprCb;.  sWal
2ea40 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20  ker.u.pSelect = 
2ea50 70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  p;.  sqlite3Walk
2ea60 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
2ea70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20  ->pHaving);.#if 
2ea80 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2ea90 4c 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65  LED.  if( sWalke
2eaa0 72 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69  r.eCode && (sqli
2eab0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2eac0 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20   0x100)!=0 ){.  
2ead0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2eae0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d  100,pParse,p,("M
2eaf0 6f 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73  ove HAVING terms
2eb00 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29   into WHERE:\n")
2eb10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2eb20 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2eb30 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2eb40 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  f.}../*.** Check
2eb50 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70   to see if the p
2eb60 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54  This entry of pT
2eb70 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66  abList is a self
2eb80 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72  -join of a prior
2eb90 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20   view..** If it 
2eba0 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  is, then return 
2ebb0 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  the SrcList_item
2ebc0 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76   for the prior v
2ebd0 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e  iew.  If it is n
2ebe0 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ot,.** then retu
2ebf0 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
2ec00 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2ec10 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56  tem *isSelfJoinV
2ec20 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  iew(.  SrcList *
2ec30 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
2ec40 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
2ec50 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20  r self-joins in 
2ec60 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  this FROM clause
2ec70 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2ec80 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73  List_item *pThis
2ec90 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2eca0 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65   prior reference
2ecb0 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72   to this subquer
2ecc0 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  y */.){.  struct
2ecd0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2ece0 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65  Item;.  for(pIte
2ecf0 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
2ed00 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49   pItem<pThis; pI
2ed10 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
2ed20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
2ed30 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2ed40 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
2ed50 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63  viaCoroutine ) c
2ed60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2ed70 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
2ed80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ed90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2eda0 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74  icmp(pItem->zDat
2edb0 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44  abase, pThis->zD
2edc0 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f  atabase)!=0 ) co
2edd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2ede0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2edf0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54  pItem->zName, pT
2ee00 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  his->zName)!=0 )
2ee10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2ee20 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2ee30 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20  mpare(0, .      
2ee40 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65      pThis->pSele
2ee50 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65  ct->pWhere, pIte
2ee60 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65  m->pSelect->pWhe
2ee70 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a  re, -1) .    ){.
2ee80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65        /* The vie
2ee90 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62  w was modified b
2eea0 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74  y some other opt
2eeb0 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61  imization such a
2eec0 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44  s.      ** pushD
2eed0 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20  ownWhereTerms() 
2eee0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
2eef0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
2ef00 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20  urn pItem;.  }. 
2ef10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
2ef20 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e  fdef SQLITE_COUN
2ef30 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2ef40 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  TION./*.** Attem
2ef50 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  pt to transform 
2ef60 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
2ef70 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  orm.**.**    SEL
2ef80 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2ef90 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
2efa0 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
2efb0 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a  LECT y FROM t2).
2efc0 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a  **.** Into this:
2efd0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2efe0 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
2eff0 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45  ) FROM t1)+(SELE
2f000 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2f010 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   t2).**.** The t
2f020 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  ransformation on
2f030 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20  ly works if all 
2f040 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2f050 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
2f060 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65     *  The subque
2f070 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  ry is a UNION AL
2f080 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  L of two or more
2f090 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54   terms.**   *  T
2f0a0 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45  here is no WHERE
2f0b0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
2f0c0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f  HAVING clauses o
2f0d0 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
2f0e0 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74  .**   *  The out
2f0f0 65 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69  er query is a si
2f100 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a  mple count(*).**
2f110 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2f120 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
2f130 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65  ion is undertake
2f140 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2f150 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69   countOfViewOpti
2f160 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  mization(Parse *
2f170 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2f180 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  p){.  Select *pS
2f190 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45  ub, *pPrior;.  E
2f1a0 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78  xpr *pExpr;.  Ex
2f1b0 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71  pr *pCount;.  sq
2f1c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
2f1d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2f1e0 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30  SF_Aggregate)==0
2f1f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f   ) return 0;   /
2f200 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61 67 67  * This is an agg
2f210 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20  regate */.  if( 
2f220 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2f230 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
2f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f250 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   Single result c
2f260 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72  olumn */.  pExpr
2f270 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
2f280 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
2f290 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
2f2a0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
2f2b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
2f2c0 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67   Result is an ag
2f2d0 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28  gregate */.  if(
2f2e0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2f2f0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
2f300 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75  ,"count") ) retu
2f310 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75  rn 0;  /* Is cou
2f320 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45  nt() */.  if( pE
2f330 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20  xpr->x.pList!=0 
2f340 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2f350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2f360 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20  ust be count(*) 
2f370 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  */.  if( p->pSrc
2f380 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
2f390 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2f3a0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61         /* One ta
2f3b0 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a  ble in FROM  */.
2f3c0 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
2f3d0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
2f3e0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
2f3f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f410 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
2f420 69 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  is a subquery */
2f430 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
2f440 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
2f450 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f460 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2f470 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f  a compound ry */
2f480 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
2f490 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20  Sub->op!=TK_ALL 
2f4a0 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  && pSub->pPrior 
2f4b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2f4c0 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c  Must be UNION AL
2f4d0 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  L */.    if( pSu
2f4e0 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  b->pWhere ) retu
2f4f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2f500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
2f510 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2f520 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73  .    if( pSub->s
2f530 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2f540 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20  regate ) return 
2f550 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e  0;     /* Not an
2f560 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
2f570 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70    pSub = pSub->p
2f580 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Prior;          
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5a0 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76      /* Repeat ov
2f5b0 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20  er compound */. 
2f5c0 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b   }while( pSub );
2f5d0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
2f5e0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  ch this point th
2f5f0 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70  en it is OK to p
2f600 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73  erform the trans
2f610 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  formation */..  
2f620 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2f630 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70  .  pCount = pExp
2f640 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  r;.  pExpr = 0;.
2f650 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
2f660 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
2f670 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
2f680 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
2f690 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
2f6a0 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29  ete(db, p->pSrc)
2f6b0 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71  ;.  p->pSrc = sq
2f6c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2f6d0 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
2f6e0 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b  zeof(*p->pSrc));
2f6f0 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29  .  while( pSub )
2f700 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72  {.    Expr *pTer
2f710 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  m;.    pPrior = 
2f720 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSub->pPrior;.  
2f730 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d    pSub->pPrior =
2f740 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e   0;.    pSub->pN
2f750 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ext = 0;.    pSu
2f760 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  b->selFlags |= S
2f770 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
2f780 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
2f790 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
2f7a0 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65  .    pSub->nSele
2f7b0 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73  ctRow = 0;.    s
2f7c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2f7d0 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70  lete(db, pSub->p
2f7e0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72  EList);.    pTer
2f7f0 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c  m = pPrior ? sql
2f800 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
2f810 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f  pCount, 0) : pCo
2f820 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  unt;.    pSub->p
2f830 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
2f840 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
2f850 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b  arse, 0, pTerm);
2f860 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  .    pTerm = sql
2f870 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2f880 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20  , TK_SELECT, 0, 
2f890 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  0);.    sqlite3P
2f8a0 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50  ExprAddSelect(pP
2f8b0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75  arse, pTerm, pSu
2f8c0 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  b);.    if( pExp
2f8d0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  r==0 ){.      pE
2f8e0 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  xpr = pTerm;.   
2f8f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45   }else{.      pE
2f900 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
2f910 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c  pr(pParse, TK_PL
2f920 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72  US, pTerm, pExpr
2f930 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  );.    }.    pSu
2f940 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  b = pPrior;.  }.
2f950 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30    p->pEList->a[0
2f960 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
2f970 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
2f980 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b  = ~SF_Aggregate;
2f990 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
2f9a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2f9b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2f9c0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
2f9d0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2f9e0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
2f9f0 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69  fter count-of-vi
2fa00 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ew optimization:
2fa10 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2fa20 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2fa30 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2fa40 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31  endif.  return 1
2fa50 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2fa60 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57  LITE_COUNTOFVIEW
2fa70 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
2fa80 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2fa90 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
2faa0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
2fab0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
2fac0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
2fad0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
2fae0 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
2faf0 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
2fb00 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
2fb10 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
2fb20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
2fb30 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
2fb40 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
2fb50 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2fb60 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2fb70 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
2fb80 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
2fb90 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
2fba0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
2fbb0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2fbc0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
2fbd0 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2fbe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2fbf0 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
2fc00 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
2fc10 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
2fc20 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
2fc30 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
2fc40 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
2fc50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
2fc60 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2fc70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2fc80 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2fc90 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
2fca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fcb0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2fcc0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
2fcd0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
2fce0 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
2fcf0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
2fd00 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
2fd10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
2fd20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2fd30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2fd40 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2fd50 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
2fd60 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
2fd70 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
2fd80 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
2fd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fda0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
2fdb0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
2fdc0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
2fdd0 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
2fde0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
2fdf0 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
2fe00 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
2fe10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
2fe20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
2fe30 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
2fe40 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
2fe50 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2fe60 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2fe70 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
2fe80 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
2fe90 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
2fea0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2feb0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2fec0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2fed0 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
2fee0 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
2fef0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
2ff00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
2ff10 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
2ff20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
2ff30 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2ff40 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
2ff50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2ff60 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
2ff70 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
2ff80 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
2ff90 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
2ffa0 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
2ffb0 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
2ffc0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
2ffd0 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
2ffe0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
2fff0 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
30000 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
30010 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
30020 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
30030 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
30040 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
30050 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
30060 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
30070 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
30080 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
30090 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
300a0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
300b0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
300c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
300d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
300e0 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20  axOrderBy = 0;  
300f0 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42  /* Added ORDER B
30100 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  Y for min/max qu
30110 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69  eries */.  u8 mi
30120 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20  nMaxFlag;       
30130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
30140 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  g for min/max qu
30150 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d  eries */..  db =
30160 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
30170 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
30180 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
30190 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
301a0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
301b0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
301c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
301d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
301e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
301f0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
30200 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
30210 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
30220 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
30230 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20  sAggInfo));.#if 
30240 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
30250 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43  LED.  SELECTTRAC
30260 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  E(1,pParse,p, ("
30270 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  begin processing
30280 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64  :\n", pParse->ad
30290 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69  drExplain));.  i
302a0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
302b0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
302c0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
302d0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
302e0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
302f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
30300 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
30310 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
30320 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
30330 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
30340 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
30350 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
30360 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
30370 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
30380 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
30390 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
303a0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
303b0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
303c0 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
303d0 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
303e0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
303f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
30400 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
30410 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
30420 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
30430 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
30440 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
30450 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
30460 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
30470 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
30480 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
30490 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
304a0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
304b0 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
304c0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
304d0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
304e0 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
304f0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
30500 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
30510 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
30520 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
30530 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
30540 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
30550 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
30560 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
30570 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
30580 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
30590 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
305a0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
305b0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
305c0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
305d0 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
305e0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
305f0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
30600 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
30610 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
30620 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
30630 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
30640 42 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  By;.  if( pParse
30650 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
30660 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
30670 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
30680 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
30690 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
306a0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
306b0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
306c0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
306d0 65 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20  e & 0x104 ){.   
306e0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
306f0 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  04,pParse,p, ("a
30700 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
30710 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
30720 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
30730 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
30740 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
30750 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
30760 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
30770 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
30780 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
30790 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 72 63  ;.  }..  if( (rc
307a0 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
307b0 52 65 77 72 69 74 65 28 70 50 61 72 73 65 2c 20  Rewrite(pParse, 
307c0 70 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  p)) ){.    goto 
307d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
307e0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
307f0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
30800 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
30810 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20 20 20   & 0x108 ){.    
30820 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
30830 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66  4,pParse,p, ("af
30840 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77 72 69  ter window rewri
30850 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  te:\n"));.    sq
30860 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
30870 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
30880 7d 0a 23 65 6e 64 69 66 0a 20 20 70 54 61 62 4c  }.#endif.  pTabL
30890 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
308a0 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
308b0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
308c0 67 61 74 65 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  gate)!=0;..  /* 
308d0 54 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20 6f  Try to various o
308e0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c  ptimizations (fl
308f0 61 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65 72  attening subquer
30900 69 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67 74  ies, and strengt
30910 68 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e  h.  ** reduction
30920 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f   of join operato
30930 72 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  rs) in the FROM 
30940 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
30950 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
30960 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
30970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
30980 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
30990 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
309a0 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
309b0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
309c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
309d0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
309e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
309f0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
30a00 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
30a10 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
30a20 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54 61  >pSelect;.    Ta
30a30 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
30a40 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  m->pTab;..    /*
30a50 20 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f   Convert LEFT JO
30a60 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20  IN into JOIN if 
30a70 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
30a80 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
30a90 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  le.    ** of the
30aa0 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64 20   LEFT JOIN used 
30ab0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
30ac0 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
30ad0 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  if( (pItem->fg.j
30ae0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
30af0 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71  T)!=0.     && sq
30b00 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
30b10 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57  NonNullRow(p->pW
30b20 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
30b30 72 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f 70  rsor).     && Op
30b40 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
30b50 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d  d(db, SQLITE_Sim
30b60 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29  plifyJoin).    )
30b70 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
30b80 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
30b90 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,p,.            
30ba0 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20      ("LEFT-JOIN 
30bb0 73 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f  simplifies to JO
30bc0 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22  IN on term %d\n"
30bd0 2c 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ,i));.      pIte
30be0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
30bf0 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f  = ~(JT_LEFT|JT_O
30c00 55 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e 73  UTER);.      uns
30c10 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57  etJoinExpr(p->pW
30c20 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
30c30 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rsor);.    }..  
30c40 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20 61    /* No futher a
30c50 63 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74 65  ction if this te
30c60 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
30c70 6c 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73 75  lause is no a su
30c80 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69 66  bquery */.    if
30c90 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
30ca0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
30cb0 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
30cc0 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
30cd0 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
30ce0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
30cf0 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
30d00 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
30d10 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
30d20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
30d30 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
30d40 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
30d50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
30d60 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
30d70 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
30d80 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
30d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30da0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
30db0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
30dc0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
30dd0 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
30de0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
30df0 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  }..    /* Do not
30e00 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   try to flatten 
30e10 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
30e20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
30e30 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20    ** Flattening 
30e40 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
30e50 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f  query is only po
30e60 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f 75  ssible if the ou
30e70 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a 2a  ter query.    **
30e80 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20   is not a join. 
30e90 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74 65   But if the oute
30ea0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
30eb0 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
30ec0 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 20  subquery.    ** 
30ed0 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
30ee0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
30ef0 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69 73  ine and there is
30f00 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f   no advantage to
30f10 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  .    ** flatteni
30f20 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ng in that case.
30f30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30f40 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
30f50 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
30f60 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
30f70 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
30f80 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
30f90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
30fa0 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74 61  uter query conta
30fb0 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22 20  ins a "complex" 
30fc0 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61 74  result set (that
30fd0 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74   is,.    ** if t
30fe0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
30ff0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
31000 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73 20   uses functions 
31010 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a 20  or subqueries). 
31020 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
31030 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61 69   subquery contai
31040 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ns an ORDER BY c
31050 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20 20  lause and if.   
31060 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 69   ** it will be i
31070 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
31080 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  co-routine, then
31090 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
310a0 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72 65    This.    ** re
310b0 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  striction allows
310c0 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73 20   SQL constructs 
310d0 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
310e0 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
310f0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
31100 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20 20  ion(x).    **   
31110 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
31120 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
31130 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
31140 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
31150 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
31160 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f  ion() is only co
31170 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31 30  mputed on the 10
31180 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20 2a   rows that.    *
31190 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72 61  * are output, ra
311a0 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79 20  ther than every 
311b0 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
311c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
311d0 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
311e0 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20 71  that the outer q
311f0 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d 70  uery have a comp
31200 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a 20  lex result set. 
31210 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74     ** means that
31220 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65 73   flattening does
31230 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65   occur on simple
31240 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74  r SQL constraint
31250 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  s without.    **
31260 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66   the expensive_f
31270 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a  unction() like:.
31280 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53      **.    **  S
31290 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
312a0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
312b0 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
312c0 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20   10);.    */.   
312d0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
312e0 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69  rBy!=0.     && i
312f0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==0.     && (p->
31300 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
31310 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30 0a  mplexResult)!=0.
31320 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
31330 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
31340 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
31350 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
31360 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
31370 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 29  ROSS))!=0).    )
31380 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
31390 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
313a0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
313b0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
313c0 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 2f  sAgg) ){.      /
313d0 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
313e0 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
313f0 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
31400 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d 31   */.      i = -1
31410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
31420 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
31430 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
31440 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
31450 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
31460 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
31470 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
31480 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
31490 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
314a0 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  By;.    }.  }.#e
314b0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
314c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
314d0 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48  ND_SELECT.  /* H
314e0 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53  andle compound S
314f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
31500 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72   using the separ
31510 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  ate multiSelect(
31520 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65  ).  ** procedure
31530 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
31540 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63  pPrior ){.    rc
31550 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
31560 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
31570 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
31580 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45  E_ENABLED.    SE
31590 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c 70 50  LECTTRACE(0x1,pP
315a0 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
315b0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
315c0 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
315d0 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53 65    if( (sqlite3Se
315e0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 32 30  lectTrace & 0x20
315f0 30 30 29 21 3d 30 20 26 26 20 45 78 70 6c 61 69  00)!=0 && Explai
31600 6e 51 75 65 72 79 50 6c 61 6e 50 61 72 65 6e 74  nQueryPlanParent
31610 28 70 50 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20  (pParse)==0 ){. 
31620 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
31630 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
31640 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
31650 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  f.    if( p->pNe
31660 78 74 3d 3d 30 20 29 20 45 78 70 6c 61 69 6e 51  xt==0 ) ExplainQ
31670 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72  ueryPlanPop(pPar
31680 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  se);.    return 
31690 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
316a0 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65    /* For each te
316b0 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
316c0 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68  lause, do two th
316d0 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41  ings:.  ** (1) A
316e0 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65  uthorized unrefe
316f0 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20  renced tables.  
31700 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20  ** (2) Generate 
31710 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
31720 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20  -queries.  */.  
31730 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
31740 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
31750 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
31760 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
31770 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
31780 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
31790 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
317a0 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64  ct *pSub;.#if !d
317b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
317c0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
317d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
317e0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63  OMIT_VIEW).    c
317f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
31800 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
31810 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73  ndif..    /* Iss
31820 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61  ue SQLITE_READ a
31830 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69  uthorizations wi
31840 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e  th a fake column
31850 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20   name for any.  
31860 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74    ** tables that
31870 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20   are referenced 
31880 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e  but from which n
31890 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74  o values are ext
318a0 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45  racted..    ** E
318b0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65  xamples of where
318c0 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20   these kinds of 
318d0 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44  null SQLITE_READ
318e0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a   authorizations.
318f0 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63      ** would occ
31900 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ur:.    **.    *
31910 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  *     SELECT cou
31920 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20  nt(*) FROM t1;  
31930 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
31940 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20  t1."".    **    
31950 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f   SELECT t1.* FRO
31960 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53  M t1, t2;   -- S
31970 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22  QLITE_READ t2.""
31980 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
31990 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
319a0 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ame is an empty 
319b0 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70  string.  It is p
319c0 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61  ossible for a ta
319d0 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61  ble to.    ** ha
319e0 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ve a column name
319f0 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73  d by the empty s
31a00 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20  tring, in which 
31a10 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
31a20 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64   way to.    ** d
31a30 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65  istinguish betwe
31a40 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63  en an unreferenc
31a50 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20  ed table and an 
31a60 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65  actual reference
31a70 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22   to the.    ** "
31a80 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72  " column. The or
31a90 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61  iginal design wa
31aa0 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  s for the fake c
31ab0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65  olumn name to be
31ac0 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20   a NULL,.    ** 
31ad0 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75  which would be u
31ae0 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74  nambiguous.  But
31af0 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a   legacy authoriz
31b00 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20  ation callbacks 
31b10 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73  might.    ** ass
31b20 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ume the column n
31b30 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  ame is non-NULL 
31b40 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54  and segfault.  T
31b50 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70  he use of an emp
31b60 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ty.    ** string
31b70 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
31b80 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20  lumn name seems 
31b90 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  safer..    */.  
31ba0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c    if( pItem->col
31bb0 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Used==0 ){.     
31bc0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
31bd0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
31be0 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e  _READ, pItem->zN
31bf0 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e  ame, "", pItem->
31c00 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
31c10 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
31c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
31c30 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
31c40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
31c50 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  EW).    /* Gener
31c60 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
31c70 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
31c80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
31c90 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20      */.    pSub 
31ca0 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
31cb0 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ;.    if( pSub==
31cc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
31cd0 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20     /* Sometimes 
31ce0 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  the code for a s
31cf0 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  ubquery will be 
31d00 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74  generated more t
31d10 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c  han.    ** once,
31d20 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
31d30 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
31d40 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
31d50 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20  a LEFT JOIN,.   
31d60 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e   ** for example.
31d70 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
31d80 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74  do not regenerat
31d90 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61  e the code to ma
31da0 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20  nifest.    ** a 
31db0 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72  view or the co-r
31dc0 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d  outine to implem
31dd0 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65  ent a view.  The
31de0 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a   first instance.
31df0 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63      ** is suffic
31e00 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65  ient, though the
31e10 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
31e20 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77  anifest the view
31e30 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a   does need.    *
31e40 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  * to be invoked 
31e50 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
31e60 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
31e70 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66  lSub ){.      if
31e80 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  ( pItem->fg.viaC
31e90 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20  oroutine==0 ){. 
31ea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
31eb0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61  broutine that ma
31ec0 6e 69 66 65 73 74 73 20 74 68 65 20 76 69 65 77  nifests the view
31ed0 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65 2d   might be a one-
31ee0 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20  time routine,.  
31ef0 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d        ** or it m
31f00 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
31f10 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69 74  rerun on each it
31f20 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20  eration because 
31f30 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  it.        ** en
31f40 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61 74  codes a correlat
31f50 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a  ed subquery. */.
31f60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31f70 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
31f80 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64  Op(v, pItem->add
31f90 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64  rFillSub)->opcod
31fa0 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20  e==OP_Once );.  
31fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31fc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
31fd0 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
31fe0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
31ff0 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
32000 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
32010 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
32020 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
32030 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
32040 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
32050 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
32060 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
32070 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
32080 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
32090 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
320a0 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
320b0 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
320c0 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
320d0 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
320e0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
320f0 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
32100 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
32110 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
32120 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
32130 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
32140 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
32150 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
32160 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
32170 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
32180 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
32190 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
321a0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
321b0 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63  ;..    /* Make c
321c0 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e  opies of constan
321d0 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  t WHERE-clause t
321e0 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65  erms in the oute
321f0 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20  r query down.   
32200 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73   ** inside the s
32210 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63  ubquery.  This c
32220 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71  an help the subq
32230 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65  uery to run more
32240 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20   efficiently..  
32250 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70 74    */.    if( Opt
32260 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
32270 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73 68  (db, SQLITE_Push
32280 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70 75  Down).     && pu
32290 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
322a0 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70  (pParse, pSub, p
322b0 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
322c0 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20  >iCursor,.      
322d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322e0 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e       (pItem->fg.
322f0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
32300 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  TER)!=0).    ){.
32310 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
32320 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66  ENABLED.      if
32330 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
32340 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
32350 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52          SELECTTR
32360 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
32370 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45  ,p,("After WHERE
32380 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
32390 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  n:\n"));.       
323a0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
323b0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
323c0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
323d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
323e0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
323f0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 50 75  00,pParse,p,("Pu
32400 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73 73  sh-down not poss
32410 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20 7d  ible\n"));.    }
32420 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74 68  ..    zSavedAuth
32430 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
32440 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
32450 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
32460 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d  hContext = pItem
32470 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  ->zName;..    /*
32480 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
32490 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
324a0 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a  subquery.    **.
324b0 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75      ** The subqu
324c0 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ery is implement
324d0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
324e0 6e 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ne if the subque
324f0 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75 61  ry is.    ** gua
32500 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68  ranteed to be th
32510 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f  e outer loop (so
32520 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
32530 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 20  t need to be.   
32540 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72   ** computed mor
32550 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20  e than once).   
32560 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a   **.    ** TODO:
32570 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65 72   Are there other
32580 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20   reasons beside 
32590 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d  (1) to use a co-
325a0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
325b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20  mplementation?. 
325c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d     */.    if( i=
325d0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  =0.     && (pTab
325e0 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
325f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
32600 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e  abList->a[1].fg.
32610 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46  jointype&(JT_LEF
32620 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
32630 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
32640 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
32650 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
32660 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
32670 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
32680 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
32690 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
326a0 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
326b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
326c0 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
326d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
326e0 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a  ddr(v)+1;.     .
326f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
32700 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
32710 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
32720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
32730 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
32740 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
32750 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
32760 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
32770 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
32780 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
32790 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
327a0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
327b0 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
327c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
327d0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
327e0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
327f0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
32800 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
32810 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
32820 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e 45 20 30  1, "CO-ROUTINE 0
32830 78 25 70 22 2c 20 70 53 75 62 29 29 3b 0a 20 20  x%p", pSub));.  
32840 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
32850 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
32860 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
32870 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
32880 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
32890 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
328a0 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
328b0 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
328c0 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75    pItem->regResu
328d0 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  lt = dest.iSdst;
328e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
328f0 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
32900 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
32910 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
32920 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
32930 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
32940 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
32950 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
32960 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
32970 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
32980 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
32990 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
329a0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
329b0 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
329c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
329d0 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
329e0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
329f0 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
32a00 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
32a10 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
32a20 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
32a30 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
32a40 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
32a50 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
32a60 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
32a70 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
32a80 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
32a90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
32aa0 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
32ab0 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
32ac0 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
32ad0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
32ae0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72  rcList_item *pPr
32af0 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ior;..      asse
32b00 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
32b10 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
32b20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
32b30 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
32b40 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
32b50 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
32b60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
32b70 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
32b80 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
32b90 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
32ba0 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
32bb0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  1;.      if( pIt
32bc0 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61  em->fg.isCorrela
32bd0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
32be0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
32bf0 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
32c00 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
32c10 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
32c20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
32c30 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
32c40 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
32c50 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
32c60 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
32c70 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
32c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
32c90 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
32ca0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
32cb0 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
32cc0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
32cd0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
32ce0 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
32cf0 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
32d00 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
32d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32d20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
32d30 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
32d40 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
32d50 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
32d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
32d70 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69  rior = isSelfJoi
32d80 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20  nView(pTabList, 
32d90 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  pItem);.      if
32da0 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ( pPrior ){.    
32db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32dc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
32dd0 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Dup, pItem->iCur
32de0 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75  sor, pPrior->iCu
32df0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61  rsor);.        a
32e00 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
32e10 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
32e20 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65       pSub->nSele
32e30 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
32e40 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74  pSelect->nSelect
32e50 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Row;.      }else
32e60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32e70 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
32e80 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
32e90 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
32ea0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78  sor);.        Ex
32eb0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
32ec0 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 41 54 45  pParse, 1, "MATE
32ed0 52 49 41 4c 49 5a 45 20 30 78 25 70 22 2c 20 70  RIALIZE 0x%p", p
32ee0 53 75 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  Sub));.        s
32ef0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
32f00 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
32f10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32f20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
32f30 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
32f40 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
32f50 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
32f60 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
32f70 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
32f80 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
32f90 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
32fa0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
32fb0 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
32fc0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
32fd0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
32fe0 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
32ff0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
33000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
33010 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
33020 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
33030 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
33040 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
33050 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
33060 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
33070 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
33080 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73  t_end;.    pPars
33090 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
330a0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
330b0 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50  eight(p);.    pP
330c0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
330d0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
330e0 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20  ontext;.#endif. 
330f0 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73   }..  /* Various
33100 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
33110 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
33120 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
33130 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
33140 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
33150 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
33160 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
33170 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
33180 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
33190 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
331a0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
331b0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
331c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
331d0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
331e0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
331f0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
33200 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
33210 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
33220 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
33230 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
33240 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
33250 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
33260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
33270 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
33280 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
33290 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
332a0 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
332b0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
332c0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
332d0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
332e0 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
332f0 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
33300 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
33310 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
33320 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
33330 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
33340 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
33350 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
33360 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
33370 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
33380 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
33390 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
333a0 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
333b0 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
333c0 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
333d0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
333e0 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
333f0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
33400 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
33410 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
33420 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
33430 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
33440 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
33450 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
33460 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
33470 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
33480 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
33490 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
334a0 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
334b0 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
334c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
334d0 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
334e0 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
334f0 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
33500 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
33510 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
33520 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
33530 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
33540 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
33550 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
33560 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
33570 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
33580 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
33590 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
335a0 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
335b0 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
335c0 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
335d0 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
335e0 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
335f0 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
33600 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
33610 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
33620 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
33630 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
33640 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
33650 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
33660 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
33670 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
33680 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
33690 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
336a0 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
336b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
336c0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
336d0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
336e0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
336f0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
33700 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
33710 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
33720 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
33730 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
33740 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
33750 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
33760 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
33770 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
33780 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
33790 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
337a0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
337b0 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
337c0 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
337d0 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
337e0 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
337f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
33800 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
33810 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
33820 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
33830 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
33840 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
33850 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
33860 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
33870 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49  p,("Transform DI
33880 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55  STINCT into GROU
33890 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  P BY:\n"));.    
338a0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
338b0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
338c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
338d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
338e0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
338f0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
33900 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
33910 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
33920 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
33930 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
33940 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
33950 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
33960 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
33970 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
33980 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
33990 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
339a0 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
339b0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
339c0 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
339d0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
339e0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
339f0 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
33a00 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
33a10 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
33a20 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
33a30 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
33a40 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
33a50 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
33a60 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
33a70 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
33a80 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
33a90 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
33aa0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
33ab0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
33ac0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
33ad0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
33ae0 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 20  romExprList(.   
33af0 20 20 20 20 20 70 50 61 72 73 65 2c 20 73 53 6f       pParse, sSo
33b00 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
33b10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
33b20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
33b30 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
33b40 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
33b50 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
33b60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33b70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
33b80 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
33b90 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
33ba0 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
33bb0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
33bc0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
33bd0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
33be0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
33bf0 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
33c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
33c10 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
33c20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
33c30 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
33c40 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
33c50 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
33c60 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
33c70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
33c80 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
33c90 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
33ca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33cb0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
33cc0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
33cd0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
33ce0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
33cf0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
33d00 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
33d10 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
33d20 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70  bel(v);.  if( (p
33d30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
33d40 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29  FixedLimit)==0 )
33d50 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  {.    p->nSelect
33d60 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
33d70 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
33d80 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69  .  }.  computeLi
33d90 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
33da0 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
33db0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
33dc0 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
33dd0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
33de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
33df0 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53  angeOpcode(v, sS
33e00 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
33e10 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  x, OP_SorterOpen
33e20 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  );.    sSort.sor
33e30 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
33e40 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
33e50 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20  }..  /* Open an 
33e60 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
33e70 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
33e80 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
33e90 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
33ea0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
33eb0 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
33ec0 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
33ed0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
33ee0 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
33ef0 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
33f00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
33f10 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
33f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f30 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
33f40 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
33f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f60 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
33f70 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
33f80 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
33f90 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20  >pEList,0,0),.  
33fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fb0 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
33fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
33fd0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
33fe0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
33ff0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
34000 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
34010 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
34020 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
34030 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
34040 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
34050 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
34060 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
34070 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
34080 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20     Window *pWin 
34090 3d 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20  = p->pWin;      
340a0 2f 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77  /* Master window
340b0 20 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c   object (or NULL
340c0 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20  ) */..    /* No 
340d0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
340e0 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
340f0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
34100 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
34110 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
34120 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
34130 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
34140 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45  .    assert( WHE
34150 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46  RE_USE_LIMIT==SF
34160 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20  _FixedLimit );. 
34170 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d     wctrlFlags |=
34180 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
34190 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20  F_FixedLimit;.. 
341a0 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20     if( pWin ){. 
341b0 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
341c0 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61 72 73  owCodeInit(pPars
341d0 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a  e, pWin);.    }.
341e0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
341f0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
34200 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54 54 52   */.    SELECTTR
34210 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
34220 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29  "WhereBegin\n"))
34230 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  ;.    pWInfo = s
34240 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
34250 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
34260 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
34270 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
34280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34290 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
342a0 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
342b0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b   p->nSelectRow);
342c0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
342d0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
342e0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
342f0 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
34300 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
34310 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
34320 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
34330 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
34340 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
34350 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
34360 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
34370 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
34380 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
34390 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
343a0 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
343b0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
343c0 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
343d0 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
343e0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
343f0 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
34400 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
34410 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
34420 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
34430 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f  ;.      sSort.bO
34440 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
34450 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72  = sqlite3WhereOr
34460 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70  deredInnerLoop(p
34470 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
34480 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
34490 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
344a0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
344b0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
344c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
344d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
344e0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
344f0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
34500 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
34510 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
34520 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
34530 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
34540 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
34550 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
34560 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
34570 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
34580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34590 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
345a0 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
345b0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
345c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
345d0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
345e0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
345f0 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
34600 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
34610 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 20 20  st==pEList );.  
34620 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20    if( pWin ){.  
34630 20 20 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75      int addrGosu
34640 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  b = sqlite3VdbeM
34650 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
34660 20 20 20 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73     int iCont = s
34670 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
34680 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
34690 74 20 72 65 67 47 6f 73 75 62 20 3d 20 2b 2b 70  t regGosub = ++p
346a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
346b0 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
346c0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ..      sqlite3W
346d0 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50  indowCodeStep(pP
346e0 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
346f0 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
34700 6f 73 75 62 29 3b 0a 0a 20 20 20 20 20 20 61 64  osub);..      ad
34710 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
34720 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
34730 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
34740 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34750 6c 28 76 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  l(v, addrGosub);
34760 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
34770 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
34780 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73  , -1, &sSort, &s
34790 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
347a0 20 69 43 6f 6e 74 2c 20 30 29 3b 0a 20 20 20 20   iCont, 0);.    
347b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
347c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
347d0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
347e0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
347f0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47 6f  OP_Return, regGo
34800 73 75 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sub);.      sqli
34810 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
34820 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20 20 7d  v, addr);..    }
34830 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
34840 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
34850 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
34860 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
34870 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
34880 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
34890 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
348a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
348b0 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
348c0 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
348d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
348e0 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
348f0 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  nfo));..      /*
34900 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
34910 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
34920 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
34930 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
34940 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  fo);.    }.  }el
34950 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
34960 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
34970 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
34980 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
34990 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
349a0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
349b0 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
349c0 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
349d0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
349e0 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
349f0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
34a00 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
34a10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
34a20 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
34a30 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
34a40 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
34a50 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
34a60 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
34a70 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
34a80 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
34a90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
34aa0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
34ab0 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
34ac0 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
34ad0 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
34ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34af0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
34b00 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
34b10 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
34b20 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
34b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b40 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
34b50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
34b60 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
34b70 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
34b80 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
34b90 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
34ba0 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
34bb0 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
34bc0 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
34bd0 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
34be0 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
34bf0 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
34c00 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
34c10 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
34c20 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
34c30 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
34c40 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
34c50 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
34c60 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
34c70 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
34c80 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
34c90 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
34ca0 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
34cb0 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47      int orderByG
34cc0 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  rp = 0; /* True 
34cd0 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  if the GROUP BY 
34ce0 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65  and ORDER BY are
34cf0 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20   the same */..  
34d00 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
34d10 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
34d20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
34d30 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
34d40 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
34d50 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
34d60 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
34d70 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
34d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
34da0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
34db0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
34dc0 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
34dd0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
34de0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
34df0 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
34e00 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
34e10 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
34e20 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
34e30 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
34e40 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
34e50 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
34e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
34e70 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
34e80 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
34e90 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
34ea0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
34eb0 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
34ec0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
34ed0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
34ee0 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
34ef0 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20  t(100) );.      
34f00 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
34f10 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63  w>66 ) p->nSelec
34f20 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d  tRow = 66;.    }
34f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
34f40 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  rt( 0==sqlite3Lo
34f50 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20  gEst(1) );.     
34f60 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
34f70 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
34f80 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
34f90 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e  th a GROUP BY an
34fa0 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  d an ORDER BY cl
34fb0 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72  ause and they ar
34fc0 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63  e.    ** identic
34fd0 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  al, then it may 
34fe0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  be possible to d
34ff0 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
35000 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20   BY clause .    
35010 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64  ** on the ground
35020 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  s that the GROUP
35030 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65   BY will cause e
35040 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
35050 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74  out .    ** in t
35060 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
35070 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f  . It also may no
35080 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59  t - the GROUP BY
35090 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20   might use a.   
350a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64   ** database ind
350b0 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72  ex that causes r
350c0 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65  ows to be groupe
350d0 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65  d together as re
350e0 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75  quired.    ** bu
350f0 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73  t not actually s
35100 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61  orted. Either wa
35110 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  y, record the fa
35120 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ct that the.    
35130 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  ** ORDER BY and 
35140 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73  GROUP BY clauses
35150 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79   are the same by
35160 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64   setting the ord
35170 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76  erByGrp.    ** v
35180 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  ariable.  */.   
35190 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
351a0 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f  ListCompare(pGro
351b0 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64  upBy, sSort.pOrd
351c0 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  erBy, -1)==0 ){.
351d0 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70        orderByGrp
351e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20   = 1;.    }. .  
351f0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
35200 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
35210 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
35220 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
35230 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
35240 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
35250 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
35260 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
35270 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
35280 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
35290 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
352a0 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
352b0 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
352c0 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
352d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
352e0 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
352f0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
35300 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
35310 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
35320 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
35330 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
35340 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
35350 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
35360 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  sNC.uNC.pAggInfo
35370 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
35380 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e    VVA_ONLY( sNC.
35390 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67  ncFlags = NC_UAg
353a0 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67  gInfo; ).    sAg
353b0 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
353c0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
353d0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
353e0 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
353f0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
35400 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
35410 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
35420 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
35430 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
35440 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
35450 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
35460 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
35470 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
35480 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
35490 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
354a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
354b0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
354c0 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
354d0 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
354e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
354f0 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e  aving==p->pHavin
35500 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
35510 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70  ert( pGroupBy==p
35520 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  ->pGroupBy );.  
35530 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
35540 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ere(pParse, p);.
35550 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d          pWhere =
35560 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
35570 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
35580 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
35590 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
355a0 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
355b0 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
355c0 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
355d0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  o.nColumn;.    i
355e0 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  f( p->pGroupBy==
355f0 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d  0 && p->pHaving=
35600 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e  =0 && sAggInfo.n
35610 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Func==1 ){.     
35620 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69   minMaxFlag = mi
35630 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41  nMaxQuery(db, sA
35640 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
35650 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f  pExpr, &pMinMaxO
35660 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c  rderBy);.    }el
35670 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78  se{.      minMax
35680 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  Flag = WHERE_ORD
35690 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
356a0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
356b0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
356c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
356d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
356e0 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
356f0 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
35700 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
35710 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
35720 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
35730 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
35740 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
35750 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
35760 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
35770 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
35780 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
35790 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
357a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
357b0 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
357c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
357d0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
357e0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
357f0 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54  _end;.#if SELECT
35800 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
35810 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
35820 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
35830 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
35840 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
35850 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
35860 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65  ,p,("After aggre
35870 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  gate analysis:\n
35880 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
35890 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
358a0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
358b0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
358c0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
358d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
358e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
358f0 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64  f("agg-column[%d
35900 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  ] iMem=%d\n",.  
35910 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
35920 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
35930 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
35940 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
35950 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
35960 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  Col[ii].pExpr, 0
35970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35980 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
35990 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69  ggInfo.nFunc; ii
359a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
359b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
359c0 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69  "agg-func[%d]: i
359d0 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
359e0 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
359f0 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d  nfo.aFunc[ii].iM
35a00 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
35a10 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
35a20 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  (0, sAggInfo.aFu
35a30 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  nc[ii].pExpr, 0)
35a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35a50 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20  #endif...    /* 
35a60 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
35a70 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
35a80 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
35a90 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
35aa0 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
35ab0 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
35ac0 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
35ad0 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
35ae0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
35af0 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
35b00 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
35b10 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
35b20 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
35b30 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
35b40 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
35b50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d  ;          /* A-
35b60 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
35b70 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
35b80 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
35b90 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
35ba0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
35bb0 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
35bc0 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
35bd0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
35be0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
35bf0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
35c00 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
35c10 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
35c20 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
35c30 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
35c40 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
35c50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
35c60 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
35c70 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
35c80 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
35c90 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
35ca0 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
35cb0 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
35cc0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
35cd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
35ce0 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
35cf0 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
35d00 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
35d10 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
35d20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
35d30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35d40 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
35d50 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
35d60 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
35d70 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
35d80 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
35d90 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
35da0 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
35db0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
35dc0 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
35dd0 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
35de0 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
35df0 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
35e00 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
35e10 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
35e20 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
35e30 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
35e40 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
35e50 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
35e60 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
35e70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
35e80 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
35e90 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
35ea0 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
35eb0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
35ec0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
35ed0 28 70 50 61 72 73 65 2c 70 47 72 6f 75 70 42 79  (pParse,pGroupBy
35ee0 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  ,0,sAggInfo.nCol
35ef0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
35f00 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
35f10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
35f20 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
35f30 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
35f40 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
35f50 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
35f60 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
35f70 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
35f80 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
35f90 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
35fa0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
35fb0 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
35fc0 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
35fd0 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
35fe0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
35ff0 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
36000 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
36010 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
36020 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
36030 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
36040 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
36050 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
36060 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
36070 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
36080 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
36090 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
360a0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
360b0 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
360c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
360d0 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
360e0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
360f0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
36100 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
36110 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
36120 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
36130 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
36140 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
36150 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
36160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36170 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
36180 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
36190 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
361a0 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
361b0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
361c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
361d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
361e0 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
361f0 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
36200 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
36210 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
36220 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
36230 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
36240 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
36250 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
36260 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
36270 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
36280 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
36290 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
362a0 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
362b0 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
362c0 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
362d0 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
362e0 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
362f0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
36300 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
36310 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
36320 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36330 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
36340 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
36350 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
36360 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
36370 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
36380 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
36390 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
363a0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
363b0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
363c0 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
363d0 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
363e0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
363f0 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
36400 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
36410 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
36420 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
36430 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
36440 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
36450 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
36460 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
36470 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
36480 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
36490 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
364a0 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
364b0 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
364c0 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
364d0 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
364e0 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
364f0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
36500 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
36510 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
36520 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
36530 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
36540 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
36550 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
36560 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
36570 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
36580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
36590 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
365a0 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
365b0 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
365c0 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
365d0 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
365e0 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
365f0 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
36600 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
36610 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
36620 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
36630 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
36640 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
36650 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
36660 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
36670 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
36680 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
36690 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
366a0 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
366b0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
366c0 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
366d0 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
366e0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
366f0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
36700 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
36710 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
36720 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
36730 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
36740 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
36750 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
36760 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
36770 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
36780 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
36790 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
367a0 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
367b0 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
367c0 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
367d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
367e0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
367f0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
36800 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
36810 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
36820 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
36830 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
36840 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
36850 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
36860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36870 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
36880 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
36890 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
368a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
368b0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
368c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
368d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
368e0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
368f0 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
36900 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
36910 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
36920 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
36930 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
36940 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
36950 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
36960 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
36970 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
36980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
36990 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
369a0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
369b0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
369c0 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
369d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
369e0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
369f0 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20  ToReg(pParse, . 
36a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
36a20 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
36a30 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
36a40 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20  Table, r1);.    
36a50 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
36a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36a70 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
36a80 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
36a90 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
36aa0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36ab0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
36ac0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
36ad0 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
36ae0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
36af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36b00 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
36b10 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
36b20 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
36b30 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
36b40 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
36b50 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
36b60 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
36b70 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
36b80 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
36b90 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
36ba0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36bb0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
36bc0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
36bd0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
36be0 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
36bf0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
36c00 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
36c10 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
36c20 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
36c30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36c40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
36c50 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
36c60 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
36c70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36c80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
36c90 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
36ca0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
36cb0 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
36cc0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36cd0 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
36ce0 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76  sort")); VdbeCov
36cf0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
36d00 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
36d10 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
36d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
36d30 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
36d40 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20  se);..      }.. 
36d50 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
36d60 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72  ndex or temporar
36d70 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  y table used by 
36d80 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72  the GROUP BY sor
36d90 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
36da0 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65  naturally delive
36db0 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72  r rows in the or
36dc0 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79 20  der required by 
36dd0 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
36de0 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61     ** clause, ca
36df0 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72  ncel the ephemer
36e00 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f  al table open co
36e10 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20  ded earlier..   
36e20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
36e30 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
36e40 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
36e50 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
36e60 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
36e70 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  less..      ** U
36e80 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
36e90 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
36ea0 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
36eb0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74  CTRL_OPTIMIZER t
36ec0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61  o .      ** disa
36ed0 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ble this optimiz
36ee0 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e  ation for testin
36ef0 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a  g purposes.  */.
36f00 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72 42        if( orderB
36f10 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  yGrp && Optimiza
36f20 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
36f30 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
36f40 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  der) .       && 
36f50 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20  (groupBySort || 
36f60 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
36f70 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20  rted(pWInfo)).  
36f80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
36f90 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
36fa0 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
36fb0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
36fc0 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
36fd0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
36fe0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
36ff0 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
37000 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
37010 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
37020 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
37030 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
37040 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
37050 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
37060 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
37070 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
37080 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
37090 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
370a0 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
370b0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
370c0 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
370d0 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
370e0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
370f0 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
37100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
37110 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
37120 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
37130 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
37140 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
37150 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
37160 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
37170 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
37180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37190 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
371a0 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ta, sAggInfo.sor
371b0 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
371c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371d0 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74     sortOut, sort
371e0 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  PTab);.      }. 
371f0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
37200 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
37210 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
37220 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
37230 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
37240 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
37250 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74   OP_Column, sort
37260 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  PTab, j, iBMem+j
37270 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
37280 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
37290 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
372a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
372b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
372c0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
372d0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
372e0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
372f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
37300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
37310 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
37320 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
37330 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
37340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37350 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
37360 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
37370 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
37380 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
37390 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
373a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
373b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
373c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
373d0 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20  _Jump, addr1+1, 
373e0 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62  0, addr1+1); Vdb
373f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
37400 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
37410 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
37420 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
37430 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
37440 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
37450 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
37460 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
37470 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
37480 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
37490 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
374a0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
374b0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
374c0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
374d0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
374e0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
374f0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
37500 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
37510 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
37520 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
37530 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
37540 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
37550 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
37560 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
37570 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
37580 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
37590 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
375a0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
375b0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
375c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
375d0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
375e0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
375f0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
37600 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
37610 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
37620 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
37630 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
37640 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
37650 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
37660 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
37670 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
37680 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
37690 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
376a0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64  ag, addrEnd); Vd
376b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
376c0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
376d0 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
376e0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
376f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37700 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
37710 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
37720 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
37730 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
37740 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
37750 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
37760 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
37770 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
37780 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
37790 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
377a0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
377b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
377c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
377d0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
377e0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
377f0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 69 55  lator(pParse, iU
37800 73 65 46 6c 61 67 2c 20 26 73 41 67 67 49 6e 66  seFlag, &sAggInf
37810 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
37820 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
37830 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
37840 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
37850 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
37860 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
37870 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
37880 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
37890 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
378a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
378b0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
378c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
378d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
378e0 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
378f0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
37900 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
37910 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
37920 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
37930 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
37940 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
37950 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
37960 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
37970 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
37980 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
37990 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
379a0 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
379b0 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
379c0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
379d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
379e0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
379f0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
37a00 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
37a10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
37a20 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
37a30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
37a40 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
37a50 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
37a60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37a70 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29  Goto(v, addrEnd)
37a80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
37a90 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
37aa0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
37ab0 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
37ac0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
37ad0 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
37ae0 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
37af0 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
37b00 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
37b10 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
37b20 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
37b30 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
37b40 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
37b50 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
37b60 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
37b70 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
37b80 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
37b90 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
37ba0 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
37bb0 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
37bc0 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
37bd0 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
37be0 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
37bf0 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
37c00 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
37c10 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
37c20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
37c30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
37c40 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
37c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37c60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
37c70 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
37c80 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
37c90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
37ca0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
37cb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37cc0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
37cd0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
37ce0 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
37cf0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
37d00 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52  l(v, addrOutputR
37d10 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
37d20 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
37d30 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
37d40 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
37d50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
37d60 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
37d70 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
37d80 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
37d90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
37da0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
37db0 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
37dc0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
37dd0 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
37de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37df0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
37e00 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
37e10 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
37e20 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
37e30 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
37e40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
37e50 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
37e60 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
37e70 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
37e80 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
37e90 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
37ea0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
37eb0 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20  , -1, &sSort,.  
37ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ed0 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
37ee0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
37ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
37f00 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
37f10 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
37f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37f30 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
37f40 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
37f50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
37f60 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
37f70 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
37f80 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
37f90 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
37fa0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
37fb0 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
37fc0 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
37fd0 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
37fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
37ff0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
38000 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
38010 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
38020 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
38030 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
38040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
38050 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55  P_Integer, 0, iU
38060 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
38070 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
38080 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
38090 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20  ator empty"));. 
380a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
380b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
380c0 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
380d0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
380e0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
380f0 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
38100 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
38110 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
38120 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66 20   else {.#ifndef 
38130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
38140 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
38150 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
38160 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
38170 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
38180 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
38190 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
381a0 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
381b0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
381c0 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
381d0 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
381e0 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
381f0 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
38200 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
38210 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
38220 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
38230 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
38240 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
38250 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
38260 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
38270 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
38280 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
38290 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
382a0 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
382b0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
382c0 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
382d0 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
382e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
382f0 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
38300 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
38310 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
38320 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
38330 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
38340 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
38350 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
38360 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
38370 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
38380 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
38390 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecu