/ Hex Artifact Content
Login

Artifact e66bb89e00608e50fa03939d5d86213a302487e8b78e0960b646be9ea0ac2f3e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%s/%d/%p: ",(S)
02c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28 50 29 2d 3e  ->zSelName,(P)->
02d0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 28 53 29 29  addrExplain,(S))
02e0: 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ,\.    sqlite3De
02f0: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0300: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43  e.# define SELEC
0310: 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a  TTRACE(K,P,S,X).
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
0330: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0350: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0360: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0370: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
0380: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
0390: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
03a0: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
03b0: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
03c0: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
03d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
03e0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
03f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
0400: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
0410: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
0420: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
0430: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
0440: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
0450: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0460: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
0470: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
0480: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
0490: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
04a0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
04b0: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
04c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
04d0: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
04e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
04f0: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
0500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
0510: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
0520: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
0530: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
0540: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0560: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0570: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0580: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52   about.** the OR
0590: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
05a0: 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71   BY) clause of q
05b0: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f  uery is being co
05c0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ded..**.** The a
05d0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
05e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72   used by the sor
05f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f  ter-references o
0600: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72  ptimization. For
0610: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
0620: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
0630: 6f 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  o index that can
0640: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0650: 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f   ORDER BY,.** fo
0660: 72 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  r the query:.**.
0670: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c  **     SELECT a,
0680: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
0690: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
06a0: 54 20 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d  T 10;.**.** it m
06b0: 61 79 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  ay be more effic
06c0: 69 65 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74  ient to add just
06d0: 20 74 68 65 20 22 61 22 20 76 61 6c 75 65 73 20   the "a" values 
06e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61  to the sorter, a
06f0: 6e 64 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  nd.** retrieve t
0700: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 62  he associated "b
0710: 69 67 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64  igblob" values d
0720: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
0730: 6c 65 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20  le t1 as the.** 
0740: 31 30 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20  10 smallest "a" 
0750: 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
0760: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f  cted from the so
0770: 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rter..**.** When
0780: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
0790: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
07a0: 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 65 72  on is used, ther
07b0: 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69  e is one entry i
07c0: 6e 20 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b  n the.** aDefer[
07d0: 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68  ] array for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
07f0: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 61 64  that may be read
0800: 20 61 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   as values are.*
0810: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
0820: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
0830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0840: 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a  ortCtx SortCtx;.
0850: 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b  struct SortCtx {
0860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0870: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
0880: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0890: 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f  UP BY clause) */
08a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20  .  int nOBSat;  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08c0: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
08d0: 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
08e0: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  y indices */.  i
08f0: 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20  nt iECursor;    
0900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0910: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f  umber for the so
0920: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rter */.  int re
0930: 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20  gReturn;        
0940: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
0950: 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74  ing block-output
0960: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
0970: 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b  */.  int labelBk
0980: 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  Out;       /* St
0990: 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  art label for th
09a0: 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73  e block-output s
09b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
09c0: 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
09d0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
09e0: 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  of the OP_Sorter
09f0: 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45  Open or OP_OpenE
0a00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e  phemeral */.  in
0a10: 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  t labelDone;    
0a20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0a30: 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20   when done, ex: 
0a40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f  LIMIT reached */
0a50: 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b  .  u8 sortFlags;
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
0a70: 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41   or more SORTFLA
0a80: 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38  G_* bits */.  u8
0a90: 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f   bOrderedInnerLo
0aa0: 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  op; /* ORDER BY 
0ab0: 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20  correctly sorts 
0ac0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
0ad0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0ae0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
0af0: 46 45 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44  FERENCES.  u8 nD
0b00: 65 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  efer;           
0b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
0b20: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
0b30: 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72  Defer[] */.  str
0b40: 75 63 74 20 44 65 66 65 72 72 65 64 43 73 72 20  uct DeferredCsr 
0b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
0b60: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  b;        /* Tab
0b70: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  le definition */
0b80: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20  .    int iCsr;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0ba0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
0bb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
0bc0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Key;           /
0bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  * Number of PK c
0be0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65  olumns for table
0bf0: 20 70 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20   pTab (>=1) */. 
0c00: 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65   } aDefer[4];.#e
0c10: 6e 64 69 66 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  ndif.};.#define 
0c20: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
0c30: 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73  er  0x01   /* Us
0c40: 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  e SorterOpen ins
0c50: 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65  tead of OpenEphe
0c60: 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  meral */../*.** 
0c70: 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63  Delete all the c
0c80: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65  ontent of a Sele
0c90: 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 44  ct structure.  D
0ca0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74  eallocate the st
0cb0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
0cc0: 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20  f only if bFree 
0cd0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
0ce0: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c  ic void clearSel
0cf0: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
0d00: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
0d10: 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28  bFree){.  while(
0d20: 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74   p ){.    Select
0d30: 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
0d40: 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  rior;.    sqlite
0d50: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0d60: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
0d70: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
0d80: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0d90: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
0da0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0db0: 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
0dc0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0dd0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0de0: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
0df0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0e00: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  b, p->pHaving);.
0e10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
0e20: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0e30: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
0e40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0e50: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
0e60: 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f  ;.    if( OK_IF_
0e70: 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70  ALWAYS_TRUE(p->p
0e80: 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33 57  With) ) sqlite3W
0e90: 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ithDelete(db, p-
0ea0: 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66 28  >pWith);.    if(
0eb0: 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65 33   bFree ) sqlite3
0ec0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
0ed0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ee0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ef0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0f00: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0f10: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0f20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0f30: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0f40: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0f50: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0f60: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0f70: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0f80: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0f90: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0fa0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 20  pDest->zAffSdst 
0fb0: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  = 0;.  pDest->iS
0fc0: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0fd0: 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a  ->nSdst = 0;.}..
0fe0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
0ff0: 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72  a new Select str
1000: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
1010: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1020: 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  hat.** structure
1030: 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c  ..*/.Select *sql
1040: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20  ite3SelectNew(. 
1050: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1060: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1070: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1080: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
1090: 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f       /* which co
10a0: 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65  lumns to include
10b0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
10c0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
10d0: 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  c,        /* the
10e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20   FROM clause -- 
10f0: 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20  which tables to 
1100: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
1110: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
1120: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
1130: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1140: 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f  t *pGroupBy,   /
1150: 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  * the GROUP BY c
1160: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
1170: 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20  *pHaving,       
1180: 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63   /* the HAVING c
1190: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
11a0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
11b0: 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   /* the ORDER BY
11c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33 32   clause */.  u32
11d0: 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20   selFlags,      
11e0: 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d     /* Flag param
11f0: 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53  eters, such as S
1200: 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  F_Distinct */.  
1210: 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20 20  Expr *pLimit    
1220: 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76        /* LIMIT v
1230: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
1240: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29 7b  s not used */.){
1250: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
1260: 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69  .  Select standi
1270: 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  n;.  pNew = sqli
1280: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
1290: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
12a0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
12b0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
12c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
12d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
12e0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20  led );.    pNew 
12f0: 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a  = &standin;.  }.
1300: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1310: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
1320: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1330: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
1340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 28      sqlite3Expr(
1370: 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53  pParse->db,TK_AS
1380: 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a  TERISK,0));.  }.
1390: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
13a0: 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d   pEList;.  pNew-
13b0: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
13c0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
13d0: 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20  s = selFlags;.  
13e0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
13f0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
1400: 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43  t = 0;.#if SELEC
1410: 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
1420: 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b   pNew->zSelName[
1430: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  0] = 0;.#endif.#
1440: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
1450: 4e 41 42 4c 45 44 20 7c 7c 20 21 64 65 66 69 6e  NABLED || !defin
1460: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
1470: 58 50 4c 41 49 4e 29 0a 20 20 70 4e 65 77 2d 3e  XPLAIN).  pNew->
1480: 69 53 65 6c 65 63 74 49 64 20 3d 20 30 3b 0a 23  iSelectId = 0;.#
1490: 65 6e 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61 64  endif.  pNew->ad
14a0: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
14b0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
14c0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
14d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
14e0: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  tRow = 0;.  if( 
14f0: 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d  pSrc==0 ) pSrc =
1500: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1510: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
1520: 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b   sizeof(*pSrc));
1530: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
1540: 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  pSrc;.  pNew->pW
1550: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
1560: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
1570: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e  = pGroupBy;.  pN
1580: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48  ew->pHaving = pH
1590: 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70  aving;.  pNew->p
15a0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
15b0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  By;.  pNew->pPri
15c0: 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  or = 0;.  pNew->
15d0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
15e0: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  w->pLimit = pLim
15f0: 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74  it;.  pNew->pWit
1600: 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  h = 0;.  if( pPa
1610: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1620: 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c  ailed ) {.    cl
1630: 65 61 72 53 65 6c 65 63 74 28 70 50 61 72 73 65  earSelect(pParse
1640: 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  ->db, pNew, pNew
1650: 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20  !=&standin);.   
1660: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
1670: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1680: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
1690: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
16a0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
16b0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
16c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
16d0: 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  ;.}..#if SELECTT
16e0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
16f0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
1700: 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a 65  of a Select obje
1710: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
1720: 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1730: 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74  Select *p, const
1740: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1750: 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65 20   if( p && zName 
1760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1770: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
1780: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e  ->zSelName), p->
1790: 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20  zSelName, "%s", 
17a0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  zName);.  }.}.#e
17b0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ndif.../*.** Del
17c0: 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65  ete the given Se
17d0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
17e0: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
17f0: 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a  bstructures..*/.
1800: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1810: 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  ctDelete(sqlite3
1820: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29   *db, Select *p)
1830: 7b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  {.  if( OK_IF_AL
1840: 57 41 59 53 5f 54 52 55 45 28 70 29 20 29 20 63  WAYS_TRUE(p) ) c
1850: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
1860: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 1);.}../*.** R
1870: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1880: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
1890: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
18a0: 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  nt in a compound
18b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65  ..*/.static Sele
18c0: 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73  ct *findRightmos
18d0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
18e0: 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20  while( p->pNext 
18f0: 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ) p = p->pNext;.
1900: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1910: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
1920: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
1930: 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e  eceding the JOIN
1940: 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d   keyword, determ
1950: 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  ine the.** type 
1960: 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e  of join.  Return
1970: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
1980: 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65 73  tant that expres
1990: 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a  ses that type.**
19a0: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
19b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76   following bit v
19c0: 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
19d0: 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20   JT_INNER.**    
19e0: 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20   JT_CROSS.**    
19f0: 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20   JT_OUTER.**    
1a00: 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20   JT_NATURAL.**  
1a10: 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20     JT_LEFT.**   
1a20: 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a    JT_RIGHT.**.**
1a30: 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f   A full outer jo
1a40: 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e  in is the combin
1a50: 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54  ation of JT_LEFT
1a60: 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a   and JT_RIGHT..*
1a70: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67  *.** If an illeg
1a80: 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  al or unsupporte
1a90: 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73  d join type is s
1aa0: 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  een, then still 
1ab0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e  return.** a join
1ac0: 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20 61   type, but put a
1ad0: 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70  n error in the p
1ae0: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
1af0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  .*/.int sqlite3J
1b00: 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  oinType(Parse *p
1b10: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41  Parse, Token *pA
1b20: 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b  , Token *pB, Tok
1b30: 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a  en *pC){.  int j
1b40: 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54  ointype = 0;.  T
1b50: 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a  oken *apAll[3];.
1b60: 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20    Token *p;.    
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31           /*   01
1b90: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
1ba0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1bb0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
1bc0: 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74  st char zKeyText
1bd0: 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74  [] = "naturaleft
1be0: 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e  outerightfullinn
1bf0: 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74  ercross";.  stat
1c00: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
1c10: 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20 20  {.    u8 i;     
1c20: 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
1c30: 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20  of keyword text 
1c40: 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f  in zKeyText[] */
1c50: 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20  .    u8 nChar;  
1c60: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1c70: 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68  he keyword in ch
1c80: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20  aracters */.    
1c90: 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20  u8 code;     /* 
1ca0: 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a  Join type mask *
1cb0: 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d  /.  } aKeyword[]
1cc0: 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75   = {.    /* natu
1cd0: 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20  ral */ { 0,  7, 
1ce0: 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20  JT_NATURAL      
1cf0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1d00: 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b   /* left    */ {
1d10: 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   6,  4, JT_LEFT|
1d20: 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20  JT_OUTER        
1d30: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65    },.    /* oute
1d40: 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20  r   */ { 10, 5, 
1d50: 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20  JT_OUTER        
1d60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1d70: 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b   /* right   */ {
1d80: 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54   14, 5, JT_RIGHT
1d90: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1da0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c    },.    /* full
1db0: 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20      */ { 19, 4, 
1dc0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
1dd0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
1de0: 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b   /* inner   */ {
1df0: 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   23, 5, JT_INNER
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73    },.    /* cros
1e20: 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20  s   */ { 28, 5, 
1e30: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53  JT_INNER|JT_CROS
1e40: 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  S         },.  }
1e50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
1e60: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
1e70: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
1e80: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
1e90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
1ea0: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
1eb0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
1ec0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
1ed0: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b  ; j<ArraySize(aK
1ee0: 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20  eyword); j++){. 
1ef0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61       if( p->n==a
1f00: 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72  Keyword[j].nChar
1f10: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
1f20: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
1f30: 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65  char*)p->z, &zKe
1f40: 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a  yText[aKeyword[j
1f50: 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29  ].i], p->n)==0 )
1f60: 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79  {.        jointy
1f70: 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a  pe |= aKeyword[j
1f80: 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].code;.        
1f90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1fa0: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1fb0: 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20  e( j==0 || j==1 
1fc0: 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20  || j==2 || j==3 
1fd0: 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20  || j==4 || j==5 
1fe0: 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69  || j==6 );.    i
1ff0: 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( j>=ArraySize(
2000: 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20  aKeyword) ){.   
2010: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a     jointype |= J
2020: 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  T_ERROR;.      b
2030: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2040: 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e    if(.     (join
2050: 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52  type & (JT_INNER
2060: 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54  |JT_OUTER))==(JT
2070: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
2080: 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79   ||.     (jointy
2090: 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d  pe & JT_ERROR)!=
20a0: 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  0.  ){.    const
20b0: 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22   char *zSp = " "
20c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
20d0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
20e0: 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d  C==0 ){ zSp++; }
20f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2100: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
2110: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
2120: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
2130: 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25  ".       "%T %T%
2140: 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53  s%T", pA, pB, zS
2150: 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  p, pC);.    join
2160: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2170: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f  .  }else if( (jo
2180: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
2190: 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  R)!=0 .         
21a0: 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28  && (jointype & (
21b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
21c0: 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  ))!=JT_LEFT ){. 
21d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21e0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
21f0: 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c    "RIGHT and FUL
2200: 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72  L OUTER JOINs ar
2210: 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  e not currently 
2220: 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20  supported");.   
2230: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2240: 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NNER;.  }.  retu
2250: 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a  rn jointype;.}..
2260: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2270: 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   index of a colu
2280: 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20  mn in a table.  
2290: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
22a0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f   column.** is no
22b0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
22c0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
22d0: 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e  tic int columnIn
22e0: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  dex(Table *pTab,
22f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2300: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
2310: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
2320: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2330: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2340: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  mp(pTab->aCol[i]
2350: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
2360: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
2370: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
2380: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
2390: 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73  e first N tables
23a0: 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c   in pSrc, from l
23b0: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f  eft to right, lo
23c0: 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74  oking for a.** t
23d0: 61 62 6c 65 20 74 68 61 74 20 68 61 73 20 61 20  able that has a 
23e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f  column named zCo
23f0: 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  l.  .**.** When 
2400: 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61  found, set *piTa
2410: 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20  b and *piCol to 
2420: 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20  the table index 
2430: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  and column index
2440: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68  .** of the match
2450: 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72  ing column and r
2460: 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a  eturn TRUE..**.*
2470: 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  * If not found, 
2480: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
2490: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c  .static int tabl
24a0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
24b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
24c0: 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ,       /* Array
24d0: 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
24e0: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  arch */.  int N,
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2500: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  * Number of tabl
2510: 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  es in pSrc->a[] 
2520: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63  to search */.  c
2530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
2540: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2550: 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65  he column we are
2560: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2570: 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20    int *piTab,   
2580: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2590: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
25a0: 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  [] here */.  int
25b0: 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20   *piCol         
25c0: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
25d0: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54   of pSrc->a[*piT
25e0: 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d  ab].pTab->aCol[]
25f0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2600: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2610: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2620: 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
2630: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2640: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2650: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
2660: 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c  mn matching zCol
2670: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
2680: 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f  piTab==0)==(piCo
2690: 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74  l==0) );  /* Bot
26a0: 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65  h or neither are
26b0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69   NULL */.  for(i
26c0: 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<N; i++){. 
26d0: 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e     iCol = column
26e0: 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d  Index(pSrc->a[i]
26f0: 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20  .pTab, zCol);.  
2700: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
2710: 0a 20 20 20 20 20 20 69 66 28 20 70 69 54 61 62  .      if( piTab
2720: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54   ){.        *piT
2730: 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ab = i;.        
2740: 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  *piCol = iCol;. 
2750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2760: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
2770: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2780: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2790: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
27a0: 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64  dd terms implied
27b0: 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20   by JOIN syntax 
27c0: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
27d0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
27e0: 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  n of a SELECT st
27f0: 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77  atement. The new
2800: 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20   term, which.** 
2810: 69 73 20 41 4e 44 65 64 20 77 69 74 68 20 74 68  is ANDed with th
2820: 65 20 65 78 69 73 74 69 6e 67 20 57 48 45 52 45  e existing WHERE
2830: 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74   clause, is of t
2840: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
2850: 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74    (tab1.col1 = t
2860: 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20  ab2.col2).**.** 
2870: 77 68 65 72 65 20 74 61 62 31 20 69 73 20 74 68  where tab1 is th
2880: 65 20 69 53 72 63 27 74 68 20 74 61 62 6c 65 20  e iSrc'th table 
2890: 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 20  in SrcList pSrc 
28a0: 61 6e 64 20 74 61 62 32 20 69 73 20 74 68 65 20  and tab2 is the 
28b0: 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e  .** (iSrc+1)'th.
28c0: 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20   Column col1 is 
28d0: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20  column iColLeft 
28e0: 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c  of tab1, and col
28f0: 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69  2 is.** column i
2900: 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32  ColRight of tab2
2910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2920: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
2930: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
2960: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
2970: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
2980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2990: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52   of tables in FR
29a0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
29b0: 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20  nt iLeft,       
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29d0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
29e0: 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69   table to join i
29f0: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2a00: 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20  iColLeft,       
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a20: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
2a30: 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  n first table */
2a40: 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20  .  int iRight,  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
2a70: 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70  econd table in p
2a80: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
2a90: 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  lRight,         
2aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2ab0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73  x of column in s
2ac0: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
2ad0: 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e   int isOuterJoin
2ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2af0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2b00: 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69   is an OUTER joi
2b10: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
2b20: 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20  Where           
2b30: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2b40: 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  : The WHERE clau
2b50: 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a  se to add to */.
2b60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2b70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2b80: 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78   Expr *pE1;.  Ex
2b90: 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20  pr *pE2;.  Expr 
2ba0: 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pEq;..  assert(
2bb0: 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b   iLeft<iRight );
2bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2bd0: 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a  >nSrc>iRight );.
2be0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
2bf0: 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b  a[iLeft].pTab );
2c00: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2c10: 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20  >a[iRight].pTab 
2c20: 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69  );..  pE1 = sqli
2c30: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2c40: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c  xpr(db, pSrc, iL
2c50: 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a  eft, iColLeft);.
2c60: 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43    pE2 = sqlite3C
2c70: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2c80: 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74  db, pSrc, iRight
2c90: 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20  , iColRight);.. 
2ca0: 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45   pEq = sqlite3PE
2cb0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45  xpr(pParse, TK_E
2cc0: 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a 20 20  Q, pE1, pE2);.  
2cd0: 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74  if( pEq && isOut
2ce0: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
2cf0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
2d00: 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  q, EP_FromJoin);
2d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2d20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2d30: 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  q, EP_TokenOnly|
2d40: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2d50: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2d60: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f  perty(pEq, EP_No
2d70: 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71  Reduce);.    pEq
2d80: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2d90: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2da0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2db0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2dc0: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
2dd0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
2de0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
2df0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2e00: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
2e10: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
2e20: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2e30: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2e40: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2e50: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2e60: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2e70: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2e80: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2e90: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2ea0: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2eb0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2ec0: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
2ed0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
2ee0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
2ef0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
2f00: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
2f10: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
2f20: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2f30: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2f40: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2f50: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2f60: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2f70: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2f80: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2f90: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2fa0: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2fb0: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2fc0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
2fd0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
2fe0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
2ff0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
3000: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
3010: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
3020: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
3030: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
3040: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
3050: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
3060: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
3070: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
3080: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
3090: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
30a0: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
30b0: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
30c0: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
30d0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
30e0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
30f0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
3100: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3110: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
3120: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
3130: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
3140: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
3150: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
3160: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
3170: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
3180: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
3190: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
31a0: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
31b0: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
31c0: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
31d0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
31e0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
31f0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
3200: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
3210: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
3220: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
3230: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
3240: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
3250: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
3260: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
3270: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
3280: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
3290: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
32a0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
32b0: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
32c0: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
32d0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
32e0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
32f0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
3300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
3310: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
3320: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
3330: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
3340: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
3350: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
3360: 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67  ce);.    p->iRig
3370: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
3380: 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69  16)iTable;.    i
3390: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  f( p->op==TK_FUN
33a0: 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c  CTION && p->x.pL
33b0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
33c0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
33d0: 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  0; i<p->x.pList-
33e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
33f0: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
3400: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
3410: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
3420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3430: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
3440: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
3450: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
3460: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
3470: 2a 20 55 6e 64 6f 20 74 68 65 20 77 6f 72 6b 20  * Undo the work 
3480: 6f 66 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 29  of setJoinExpr()
3490: 2e 20 20 49 6e 20 74 68 65 20 65 78 70 72 65 73  .  In the expres
34a0: 73 69 6f 6e 20 74 72 65 65 20 70 2c 20 63 6f 6e  sion tree p, con
34b0: 76 65 72 74 20 65 76 65 72 79 0a 2a 2a 20 74 65  vert every.** te
34c0: 72 6d 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65  rm that is marke
34d0: 64 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f  d with EP_FromJo
34e0: 69 6e 20 61 6e 64 20 69 52 69 67 68 74 4a 6f 69  in and iRightJoi
34f0: 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 69  nTable==iTable i
3500: 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  nto.** an ordina
3510: 72 79 20 74 65 72 6d 20 74 68 61 74 20 6f 6d 69  ry term that omi
3520: 74 73 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ts the EP_FromJo
3530: 69 6e 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54  in mark..**.** T
3540: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
3550: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 69 73 20   a LEFT JOIN is 
3560: 73 69 6d 70 6c 69 66 69 65 64 20 69 6e 74 6f 20  simplified into 
3570: 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e  an ordinary JOIN
3580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3590: 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 45   unsetJoinExpr(E
35a0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
35b0: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
35c0: 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  ){.    if( ExprH
35d0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
35e0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
35f0: 26 26 20 28 69 54 61 62 6c 65 3c 30 20 7c 7c 20  && (iTable<0 || 
3600: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
3610: 6c 65 3d 3d 69 54 61 62 6c 65 29 20 29 7b 0a 20  le==iTable) ){. 
3620: 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72       ExprClearPr
3630: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
3640: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  mJoin);.    }.  
3650: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3660: 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78  FUNCTION && p->x
3670: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  .pList ){.      
3680: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
3690: 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69  (i=0; i<p->x.pLi
36a0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
36b0: 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  .        unsetJo
36c0: 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73  inExpr(p->x.pLis
36d0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
36e0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
36f0: 20 20 20 20 7d 0a 20 20 20 20 75 6e 73 65 74 4a      }.    unsetJ
3700: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
3710: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
3720: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
3730: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
3740: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
3750: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
3760: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
3770: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
3780: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
3790: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
37a0: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
37b0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
37c0: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
37d0: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
37e0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
37f0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
3800: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
3810: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
3820: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
3830: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
3840: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
3850: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
3860: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
3870: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
3880: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
3890: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
38a0: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
38b0: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
38c0: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
38d0: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
38e0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
38f0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
3900: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
3910: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
3920: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
3930: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
3940: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
3950: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
3960: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
3970: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
3980: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
3990: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
39a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
39b0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
39c0: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
39d0: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
39e0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
39f0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
3a00: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
3a10: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
3a20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3a30: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3a40: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3a50: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3a60: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3a80: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3a90: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3aa0: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3ab0: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3ac0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3ad0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3ae0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
3af0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
3b00: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
3b10: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
3b20: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
3b30: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3b40: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3b50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3b60: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3b70: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3b80: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  ){.    Table *pR
3b90: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
3ba0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20  ->pTab;.    int 
3bb0: 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66  isOuter;..    if
3bc0: 28 20 4e 45 56 45 52 28 70 4c 65 66 74 2d 3e 70  ( NEVER(pLeft->p
3bd0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
3be0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
3bf0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
3c00: 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  = (pRight->fg.jo
3c10: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
3c20: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
3c30: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
3c40: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
3c50: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
3c60: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
3c70: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
3c80: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
3c90: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
3ca0: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
3cb0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67    if( pRight->fg
3cc0: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
3cd0: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
3ce0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
3cf0: 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  || pRight->pUsin
3d00: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
3d10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3d20: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
3d30: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
3d40: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
3d50: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
3d60: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
3d70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
3d90: 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62  j=0; j<pRightTab
3da0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3db0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
3dc0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
3dd0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69  column in the ri
3de0: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ght table */.   
3df0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
3e00: 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
3e10: 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  left table */.  
3e20: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3e30: 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67  ol;  /* Matching
3e40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c   column in the l
3e50: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  eft table */..  
3e60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52        zName = pR
3e70: 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  ightTab->aCol[j]
3e80: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3e90: 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  if( tableAndColu
3ea0: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3eb0: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3ec0: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a  , &iLeftCol) ){.
3ed0: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
3ee0: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3ef0: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3f00: 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20  tCol, i+1, j,.  
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
3f30: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
3f40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3f50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
3f60: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
3f70: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
3f80: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
3f90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3fa0: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
3fb0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3fd0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
3fe0: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
3ff0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
4000: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
4010: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
4020: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4030: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
4040: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
4050: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
4060: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4070: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
4080: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
4090: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
40a0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
40b0: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
40c0: 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69  isOuter ) setJoi
40d0: 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f  nExpr(pRight->pO
40e0: 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73  n, pRight->iCurs
40f0: 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57  or);.      p->pW
4100: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
4110: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
4120: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69  , p->pWhere, pRi
4130: 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  ght->pOn);.     
4140: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30   pRight->pOn = 0
4150: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4160: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
4170: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
4180: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
4190: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
41a0: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
41b0: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
41c0: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
41d0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
41e0: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
41f0: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
4200: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
4210: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
4220: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
4230: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
4240: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
4250: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
4260: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
4270: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
4280: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
4290: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
42a0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
42b0: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
42c0: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
42d0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
42e0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
42f0: 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  ( pRight->pUsing
4300: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
4310: 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74   *pList = pRight
4320: 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20  ->pUsing;.      
4330: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74  for(j=0; j<pList
4340: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
4350: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
4360: 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
4370: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
4380: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f   USING clause */
4390: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
43a0: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ft;       /* Tab
43b0: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77  le on the left w
43c0: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  ith matching col
43d0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
43e0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
43f0: 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ;    /* Column n
4400: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
4410: 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  g column on the 
4420: 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  left */.        
4430: 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20  int iRightCol;  
4440: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
4450: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
4460: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68  lumn on the righ
4470: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  t */..        zN
4480: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
4490: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
44a0: 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c   iRightCol = col
44b0: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
44c0: 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab, zName);.    
44d0: 20 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f      if( iRightCo
44e0: 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  l<0.         || 
44f0: 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49  !tableAndColumnI
4500: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
4510: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
4520: 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20  iLeftCol).      
4530: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
4540: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4550: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a  Parse, "cannot j
4560: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
4570: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20   %s - column ". 
4580: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
4590: 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20  present in both 
45a0: 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b  tables", zName);
45b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
45c0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
45d0: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
45e0: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
45f0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
4600: 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f  l, i+1, iRightCo
4610: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
4620: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
4630: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
4640: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4650: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4660: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4670: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65  nce */.static Ke
4680: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
4690: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
46a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
46b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
46c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
46d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
46e0: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
46f0: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
4700: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
4710: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
4720: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
4730: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
4740: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
4750: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
4760: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4770: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
4780: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
4790: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  /.);../*.** Gene
47a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
47b0: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
47c0: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
47d0: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
47e0: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
47f0: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
4800: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4810: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
4820: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4830: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
4840: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4850: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
4860: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
4870: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4880: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4890: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
48a0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
48b0: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
48c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
48d0: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
48e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
48f0: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
4900: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
4910: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
4920: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
4930: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4940: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4950: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
4960: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
4970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4980: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4990: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
49a0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
49b0: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
49c0: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
49d0: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
49e0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
49f0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4a00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
4a30: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
4a40: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
4a50: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
4a60: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4a70: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4a80: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4a90: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4aa0: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4ab0: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4ac0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4ad0: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4ae0: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4af0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4b00: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
4b10: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
4b20: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
4b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
4b60: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4b70: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4b80: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4b90: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4ba0: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4bb0: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4bd0: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4bf0: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4c00: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
4c10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
4c40: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
4c50: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
4c60: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69  r */.  int iLimi
4c70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
4c90: 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  IT counter */.. 
4ca0: 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30   assert( bSeq==0
4cb0: 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20   || bSeq==1 );. 
4cc0: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
4cd0: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
4ce0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
4cf0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20  OrigData==0 );. 
4d00: 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20   if( nPrefixReg 
4d10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
4d20: 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72  PrefixReg==nExpr
4d30: 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67  +bSeq );.    reg
4d40: 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d  Base = regData -
4d50: 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20   nExpr - bSeq;. 
4d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42   }else{.    regB
4d70: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
4d80: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72  em + 1;.    pPar
4d90: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73  se->nMem += nBas
4da0: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
4db0: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
4dc0: 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d  t==0 || pSelect-
4dd0: 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >iLimit!=0 );.  
4de0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4df0: 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c  ->iOffset ? pSel
4e00: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ect->iOffset+1 :
4e10: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4e20: 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  ;.  pSort->label
4e30: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4e40: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4e50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4e60: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4e70: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
4e80: 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f  y, regBase, regO
4e90: 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20  rigData,.       
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
4ec0: 55 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74  UP | (regOrigDat
4ed0: 61 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  a? SQLITE_ECEL_R
4ee0: 45 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20  EF : 0));.  if( 
4ef0: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
4f00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4f10: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4f20: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4f30: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
4f40: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
4f50: 52 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e  Reg==0 && nData>
4f60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4f70: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
4f80: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
4f90: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
4fa0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
4fb0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
4fc0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4fd0: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4fe0: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4ff0: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
5000: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
5010: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
5020: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
5030: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
5040: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
5050: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
5060: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
5070: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
5080: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
5090: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
50a0: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
50b0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
50c0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
50d0: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
50e0: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
50f0: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
5100: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
5110: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
5120: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
5130: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
5140: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 73 71  table */..    sq
5150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5160: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5170: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
5180: 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 72  , nBase-nOBSat,r
5190: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 72  egRecord);.    r
51a0: 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72  egPrevKey = pPar
51b0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
51c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
51d0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
51e0: 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20     nKey = nExpr 
51f0: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20  - pSort->nOBSat 
5200: 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20  + bSeq;.    if( 
5210: 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64  bSeq ){.      ad
5220: 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
5230: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5240: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65  P_IfNot, regBase
5250: 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65  +nExpr); .    }e
5260: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46  lse{.      addrF
5270: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5280: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
5290: 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f  equenceTest, pSo
52a0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
52b0: 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76     }.    VdbeCov
52c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
52d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
52e0: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
52f0: 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61  egPrevKey, regBa
5300: 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  se, pSort->nOBSa
5310: 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71  t);.    pOp = sq
5320: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
5330: 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72  , pSort->addrSor
5340: 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  tIndex);.    if(
5350: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
5360: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
5370: 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20  rn;.    pOp->p2 
5380: 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a  = nKey + nData;.
5390: 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70      pKI = pOp->p
53a0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
53b0: 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72  memset(pKI->aSor
53c0: 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e  tOrder, 0, pKI->
53d0: 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d  nKeyField); /* M
53e0: 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73  akes OP_Jump tes
53f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
5400: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5410: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
5420: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
5430: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
5440: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20  KI->nAllField > 
5450: 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32  pKI->nKeyField+2
5460: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
5470: 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
5480: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
5490: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f  Parse, pSort->pO
54a0: 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a  rderBy, nOBSat,.
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 20 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e             pKI->
54e0: 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e  nAllField-pKI->n
54f0: 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20  KeyField-1);.   
5500: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
5510: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5520: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
5530: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5540: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
5550: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
5560: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5570: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
5580: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
5590: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
55a0: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
55b0: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
55c0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
55d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
55e0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
55f0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
5600: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5610: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5620: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5630: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
5640: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
5650: 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b     if( iLimit ){
5660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5680: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53  fNot, iLimit, pS
5690: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b  ort->labelDone);
56a0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
56b0: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
56c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
56d0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72  pHere(v, addrFir
56e0: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
56f0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
5700: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  rse, regBase, re
5710: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
5720: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
5730: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5740: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
5750: 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20   }.  if( iLimit 
5760: 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  ){.    /* At thi
5770: 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c 75  s point the valu
5780: 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  es for the new s
5790: 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65 20  orter entry are 
57a0: 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e  stored.    ** in
57b0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
57c0: 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65 65  isters. They nee
57d0: 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64  d to be composed
57e0: 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a 20   into a record. 
57f0: 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74     ** and insert
5800: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
5810: 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61 29  er if either (a)
5820: 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
5830: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73  ntly.    ** less
5840: 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53   than LIMIT+OFFS
5850: 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29 20  ET items or (b) 
5860: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
5870: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
5880: 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67 65      ** the large
5890: 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  st record curren
58a0: 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  tly in the sorte
58b0: 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72 75  r. If (b) is tru
58c0: 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20 20  e and there.    
58d0: 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 4c  ** are already L
58e0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
58f0: 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  s in the sorter,
5900: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72 67   delete the larg
5910: 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  est.    ** entry
5920: 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e   before insertin
5930: 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54  g the new one. T
5940: 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61 72  his way there ar
5950: 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20 20  e never more .  
5960: 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b    ** than LIMIT+
5970: 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20  OFFSET items in 
5980: 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20 20  the sorter..    
5990: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
59a0: 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73   new record does
59b0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
59c0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
59d0: 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a  e sorter,.    **
59e0: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
59f0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
5a00: 68 65 20 6c 6f 6f 70 2e 20 4f 72 2c 20 69 66 20  he loop. Or, if 
5a10: 74 68 65 0a 20 20 20 20 2a 2a 20 70 53 6f 72 74  the.    ** pSort
5a20: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5a30: 6f 6f 70 20 66 6c 61 67 20 69 73 20 73 65 74 20  oop flag is set 
5a40: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
5a50: 20 74 68 65 20 69 6e 6e 65 72 0a 20 20 20 20 2a   the inner.    *
5a60: 2a 20 6c 6f 6f 70 20 64 65 6c 69 76 65 72 73 20  * loop delivers 
5a70: 69 74 65 6d 73 20 69 6e 20 73 6f 72 74 65 64 20  items in sorted 
5a80: 6f 72 64 65 72 2c 20 6a 75 6d 70 20 74 6f 20 74  order, jump to t
5a90: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
5aa0: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
5ab0: 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 20 20  outer loop..    
5ac0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20  */.    int iCsr 
5ad0: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
5ae0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 4a 6d 70 20  r;.    int iJmp 
5af0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5b00: 72 65 6e 74 41 64 64 72 28 76 29 2b 35 2b 28 6e  rentAddr(v)+5+(n
5b10: 4f 42 53 61 74 3c 3d 30 29 2b 70 53 6f 72 74 2d  OBSat<=0)+pSort-
5b20: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
5b30: 6f 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  op;.    assert( 
5b40: 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49  pSort->bOrderedI
5b50: 6e 6e 65 72 4c 6f 6f 70 3d 3d 30 20 7c 7c 20 70  nnerLoop==0 || p
5b60: 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Sort->bOrderedIn
5b70: 6e 65 72 4c 6f 6f 70 3d 3d 31 20 29 3b 0a 20 20  nerLoop==1 );.  
5b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5b90: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a  Op2(v, OP_IfNotZ
5ba0: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 73 71 6c  ero, iLimit, sql
5bb0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5bc0: 64 64 72 28 76 29 2b 34 29 3b 0a 20 20 20 20 56  ddr(v)+4);.    V
5bd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5bf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp2(v, OP_Last
5c00: 2c 20 69 43 73 72 2c 20 30 29 3b 0a 20 20 20 20  , iCsr, 0);.    
5c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c20: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45  4Int(v, OP_IdxLE
5c30: 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2c 20 72 65  , iCsr, iJmp, re
5c40: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 45  gBase+nOBSat, nE
5c50: 78 70 72 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 20  xpr-nOBSat);.   
5c60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5c70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5c80: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
5c90: 6c 65 74 65 2c 20 69 43 73 72 29 3b 0a 20 20 7d  lete, iCsr);.  }
5ca0: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3c 3d 30  .  if( nOBSat<=0
5cb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
5cc0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5cd0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
5ce0: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
5cf0: 65 2d 6e 4f 42 53 61 74 2c 72 65 67 52 65 63 6f  e-nOBSat,regReco
5d00: 72 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rd);.  }.  if( p
5d10: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
5d20: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
5d30: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
5d40: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
5d50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
5d60: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
5d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
5d80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
5d90: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
5da0: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
5dd0: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
5de0: 53 61 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Sat);.}../*.** A
5df0: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
5e00: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
5e10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5e20: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
5e30: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
5e40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5e50: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
5e60: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
5e70: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5e80: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5e90: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5ea0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5eb0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5ec0: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5ed0: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5ee0: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5ef0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5f00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5f10: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
5f20: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
5f30: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f40: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
5f50: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
5f60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
5f70: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5f80: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5f90: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5fa0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5fb0: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5fc0: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5fd0: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5fe0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5ff0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
6000: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
6010: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
6020: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
6030: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
6040: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
6050: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
6060: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
6070: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
6080: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
6090: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
60a0: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
60b0: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
60c0: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
60d0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
60e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
60f0: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
6100: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6110: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
6120: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
6130: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6140: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
6150: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
6160: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
6170: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
6180: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
6190: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
61a0: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
61b0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
61c0: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
61d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
61e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
61f0: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
6200: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
6210: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
6220: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
6230: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6240: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
6250: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6260: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6270: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
6280: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
6290: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
62a0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
62b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
62c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
62d0: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
62e0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
62f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
6300: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
6310: 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e  Tab, r1, iMem, N
6320: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6330: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
6340: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
6350: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
6360: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6370: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 64 65  e, r1);.}..#ifde
6380: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6390: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
63a0: 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  S./*.** This fun
63b0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
63c0: 61 73 20 70 61 72 74 20 6f 66 20 69 6e 6e 65 72  as part of inner
63d0: 2d 6c 6f 6f 70 20 67 65 6e 65 72 61 74 69 6f 6e  -loop generation
63e0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 0a 2a 2a   for a SELECT.**
63f0: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
6400: 61 6e 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  an ORDER BY that
6410: 20 69 73 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   is not optimize
6420: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 49  d by an index. I
6430: 74 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73  t .** determines
6440: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
6450: 2c 20 69 66 20 61 6e 79 2c 20 74 68 61 74 20 74  , if any, that t
6460: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
6470: 6e 63 65 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  nce .** optimiza
6480: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 75  tion should be u
6490: 73 65 64 20 66 6f 72 2e 20 54 68 65 20 73 6f 72  sed for. The sor
64a0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70  ter-reference op
64b0: 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73  timization.** is
64c0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
64d0: 20 71 75 65 72 69 65 73 20 6c 69 6b 65 3a 0a 2a   queries like:.*
64e0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2c  *.**   SELECT a,
64f0: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
6500: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
6510: 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  T 10.**.** If th
6520: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
6530: 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
6540: 73 73 69 6f 6e 20 22 62 69 67 62 6c 6f 62 22 2c  ssion "bigblob",
6550: 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66   then instead of
6560: 0a 2a 2a 20 73 74 6f 72 69 6e 67 20 76 61 6c 75  .** storing valu
6570: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 61  es read from tha
6580: 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  t column in the 
6590: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2c 20  sorter records, 
65a0: 74 68 65 20 50 4b 20 6f 66 0a 2a 2a 20 74 68 65  the PK of.** the
65b0: 20 72 6f 77 20 66 72 6f 6d 20 74 61 62 6c 65 20   row from table 
65c0: 74 31 20 69 73 20 73 74 6f 72 65 64 20 69 6e 73  t1 is stored ins
65d0: 74 65 61 64 2e 20 54 68 65 6e 2c 20 61 73 20 72  tead. Then, as r
65e0: 65 63 6f 72 64 73 20 61 72 65 20 65 78 74 72 61  ecords are extra
65f0: 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  cted from.** the
6600: 20 73 6f 72 74 65 72 20 74 6f 20 72 65 74 75 72   sorter to retur
6610: 6e 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74  n to the user, t
6620: 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75  he required valu
6630: 65 20 6f 66 20 62 69 67 62 6c 6f 62 20 69 73 0a  e of bigblob is.
6640: 2a 2a 20 72 65 74 72 69 65 76 65 64 20 64 69 72  ** retrieved dir
6650: 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65  ectly from table
6660: 20 74 31 2e 20 49 66 20 74 68 65 20 76 61 6c 75   t1. If the valu
6670: 65 73 20 61 72 65 20 76 65 72 79 20 6c 61 72 67  es are very larg
6680: 65 2c 20 74 68 69 73 20 0a 2a 2a 20 63 61 6e 20  e, this .** can 
6690: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
66a0: 74 20 74 68 61 6e 20 73 74 6f 72 69 6e 67 20 74  t than storing t
66b0: 68 65 6d 20 64 69 72 65 63 74 6c 79 20 69 6e 20  hem directly in 
66c0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
66d0: 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  ds..**.** The Ex
66e0: 70 72 4c 69 73 74 5f 69 74 65 6d 2e 62 53 6f 72  prList_item.bSor
66f0: 74 65 72 52 65 66 20 66 6c 61 67 20 69 73 20 73  terRef flag is s
6700: 65 74 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  et for each expr
6710: 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74  ession in pEList
6720: 20 0a 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74   .** for which t
6730: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
6740: 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
6750: 20 73 68 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c   should be enabl
6760: 65 64 2e 20 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ed. .** Addition
6770: 61 6c 6c 79 2c 20 74 68 65 20 70 53 6f 72 74 2d  ally, the pSort-
6780: 3e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20  >aDefer[] array 
6790: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
67a0: 68 20 65 6e 74 72 69 65 73 0a 2a 2a 20 66 6f 72  h entries.** for
67b0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 72 65 71   all cursors req
67c0: 75 69 72 65 64 20 74 6f 20 65 76 61 6c 75 61 74  uired to evaluat
67d0: 65 20 61 6c 6c 20 73 65 6c 65 63 74 65 64 20 65  e all selected e
67e0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 69 6e 61  xpressions. Fina
67f0: 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70 75 74 20 76  lly..** output v
6800: 61 72 69 61 62 6c 65 20 28 2a 70 70 45 78 74 72  ariable (*ppExtr
6810: 61 29 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  a) is set to an 
6820: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
6830: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 65 78  containing.** ex
6840: 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 61 6c  pressions for al
6850: 6c 20 65 78 74 72 61 20 50 4b 20 76 61 6c 75 65  l extra PK value
6860: 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
6870: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
6880: 2a 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73  * sorter records
6890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
68a0: 20 73 65 6c 65 63 74 45 78 70 72 44 65 66 65 72   selectExprDefer
68b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
68c0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
68d0: 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79      /* Leave any
68e0: 20 65 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a 20   error here */. 
68f0: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 20 2f 2a 20 53 6f 72 74 65 72 20 63 6f 6e 74 65   /* Sorter conte
6920: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
6930: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
6940: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
6950: 73 73 69 6f 6e 73 20 64 65 73 74 69 6e 65 64 20  ssions destined 
6960: 66 6f 72 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  for sorter */.  
6970: 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 45 78 74  ExprList **ppExt
6980: 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
6990: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 74  /* Expressions t
69a0: 6f 20 61 70 70 65 6e 64 20 74 6f 20 73 6f 72 74  o append to sort
69b0: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  er record */.){.
69c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
69d0: 44 65 66 65 72 20 3d 20 30 3b 0a 20 20 45 78 70  Defer = 0;.  Exp
69e0: 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20  rList *pExtra = 
69f0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
6a00: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
6a10: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
6a20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6a30: 49 74 65 6d 20 3d 20 26 70 45 4c 69 73 74 2d 3e  Item = &pEList->
6a40: 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 49  a[i];.    if( pI
6a50: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
6a60: 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  yCol==0 ){.     
6a70: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
6a80: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
6a90: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
6aa0: 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
6ab0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
6ac0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
6ad0: 70 54 61 62 20 26 26 20 21 49 73 56 69 72 74 75  pTab && !IsVirtu
6ae0: 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20 20 20  al(pTab).       
6af0: 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  && (pTab->aCol[p
6b00: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 63  Expr->iColumn].c
6b10: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
6b20: 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 23 69 66  G_SORTERREF).#if
6b30: 20 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20   0.          && 
6b40: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 26 26  pTab->pSchema &&
6b50: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
6b60: 30 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  0 && !IsVirtual(
6b70: 70 54 61 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  pTab).#endif.   
6b80: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
6b90: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
6ba0: 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72 3b 20  (j=0; j<nDefer; 
6bb0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
6bc0: 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  if( pSort->aDefe
6bd0: 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78 70 72  r[j].iCsr==pExpr
6be0: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
6bf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6c00: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65 66 65      if( j==nDefe
6c10: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  r ){.          i
6c20: 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72 61 79  f( nDefer==Array
6c30: 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44 65 66  Size(pSort->aDef
6c40: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
6c50: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6c70: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b            int nK
6c80: 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ey = 1;.        
6c90: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
6ca0: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
6cb0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
6cc0: 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
6cd0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
6ce0: 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 73 71          pPk = sq
6cf0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
6d00: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
6d10: 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d            nKey =
6d20: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20   pPk->nKeyCol;. 
6d30: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6d40: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
6d50: 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a  ; k<nKey; k++){.
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
6d70: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
6d80: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
6d90: 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29  TK_COLUMN, 0, 0)
6da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6db0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
6dd0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
6de0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
6df0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6e00: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
6e10: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
6e20: 20 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d      pNew->iColum
6e30: 6e 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61  n = pPk ? pPk->a
6e40: 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b  iColumn[k] : -1;
6e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e60: 20 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65   pExtra = sqlite
6e70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6e80: 70 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20  pParse, pExtra, 
6e90: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
6ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6ec0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e   pSort->aDefer[n
6ed0: 44 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45  Defer].pTab = pE
6ee0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
6ef0: 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44         pSort->aD
6f00: 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43 73  efer[nDefer].iCs
6f10: 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  r = pExpr->iTabl
6f20: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e;.            p
6f30: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65  Sort->aDefer[nDe
6f40: 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65 79  fer].nKey = nKey
6f50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 44  ;.            nD
6f60: 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  efer++;.        
6f70: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6f80: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f        pItem->bSo
6f90: 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20 20  rterRef = 1;.   
6fa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6fb0: 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 3d   pSort->nDefer =
6fc0: 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20 2a   (u8)nDefer;.  *
6fd0: 70 70 45 78 74 72 61 20 3d 20 70 45 78 74 72 61  ppExtra = pExtra
6fe0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
6ff0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
7000: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
7010: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
7020: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
7030: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
7040: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
7050: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
7060: 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69  then the p->pELi
7070: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
7080: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
7090: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
70a0: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
70b0: 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61  s row.  If srcTa
70c0: 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20  b is.** zero or 
70d0: 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20  more, then data 
70e0: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73  is pulled from s
70f0: 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c  rcTab and p->pEL
7100: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
7110: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20   .** to get the 
7120: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
7130: 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74  s and the collat
7140: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
7150: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
7160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
7170: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
7180: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7190: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
71a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
71b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
71c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
71d0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
71e0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
71f0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
7200: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
7210: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
7220: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
7230: 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e if non-negativ
7240: 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  e */.  SortCtx *
7250: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f  pSort,         /
7260: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
7270: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
7280: 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a  ocess ORDER BY *
7290: 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
72a0: 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49  *pDistinct, /* I
72b0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f  f not NULL, info
72c0: 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65   on how to proce
72d0: 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  ss DISTINCT */. 
72e0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
72f0: 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  st,      /* How 
7300: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
7310: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
7320: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
7330: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
7340: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
7350: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
7360: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
7370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
7380: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
7390: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
73a0: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
73b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
73c0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
73d0: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
73e0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
73f0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
7400: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
7410: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
7420: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
7430: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
7440: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
7450: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
7460: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
7470: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
7480: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
7490: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
74a0: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
74b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
74c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
74d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
74e0: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d  int nPrefixReg =
74f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
7500: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
7510: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
7520: 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  regResult */..  
7530: 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52  /* Usually, regR
7540: 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72  esult is the fir
7550: 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72  st cell in an ar
7560: 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ray of memory ce
7570: 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  lls.  ** contain
7580: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
7590: 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74  result row. In t
75a0: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
75b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
75c0: 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20   ** same value. 
75d0: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
75e0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
75f0: 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f  g sent to the so
7600: 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76  rter, the.  ** v
7610: 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78  alues for any ex
7620: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
7630: 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20  re also part of 
7640: 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65  the sort-key are
7650: 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72   omitted.  ** fr
7660: 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49  om this array. I
7670: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7680: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65  rig is set to ze
7690: 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ro.  */.  int re
76a0: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
76b0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
76c0: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
76d0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73   current results
76e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
76f0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
7700: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
7710: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c  mory holding ful
7720: 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20  l result (or 0) 
7730: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
7740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7750: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
7760: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
7770: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
7780: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
7790: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
77a0: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
77b0: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
77c0: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
77d0: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
77e0: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
77f0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
7800: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
7810: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
7820: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
7830: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
7840: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
7850: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
7860: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
7870: 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
7880: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
7890: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
78a0: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
78b0: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
78c0: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
78d0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
78e0: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
78f0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
7900: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
7910: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
7920: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
7930: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
7940: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
7950: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
7960: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7970: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
7980: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
7990: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
79a0: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
79b0: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
79c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
79d0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
79e0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
79f0: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
7a00: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
7a10: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
7a20: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
7a30: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
7a40: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
7a50: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
7a60: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
7a70: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
7a80: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
7a90: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
7aa0: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
7ab0: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
7ac0: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
7ad0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
7ae0: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
7af0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
7b00: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
7b10: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
7b20: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
7b30: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
7b40: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
7b50: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
7b60: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
7b70: 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d  Col;.  regOrig =
7b80: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
7b90: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
7ba0: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
7bb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
7bc0: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
7bd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7be0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
7bf0: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
7c00: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
7c10: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
7c20: 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c  (v, "%s", p->pEL
7c30: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
7c40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
7c50: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
7c60: 45 78 69 73 74 73 20 29 7b 0a 23 69 66 64 65 66  Exists ){.#ifdef
7c70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
7c80: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
7c90: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
7ca0: 45 78 74 72 61 20 3d 20 30 3b 0a 23 65 6e 64 69  Extra = 0;.#endi
7cb0: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  f.    /* If the 
7cc0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
7cd0: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
7ce0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
7cf0: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
7d00: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
7d10: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
7d20: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
7d30: 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c  */.    u8 ecelFl
7d40: 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ags;.    if( eDe
7d50: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
7d60: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7d70: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
7d80: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7d90: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
7da0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
7db0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7dc0: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
7dd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
7de0: 72 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63  rt && hasDistinc
7df0: 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53  t==0 && eDest!=S
7e00: 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65  RT_EphemTab && e
7e10: 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
7e20: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
7e30: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
7e40: 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61  in p->pEList tha
7e50: 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61  t is a copy of a
7e60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a  n expression in.
7e70: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44        ** the ORD
7e80: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ER BY clause (pS
7e90: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20  ort->pOrderBy), 
7ea0: 73 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  set the associat
7eb0: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72  ed .      ** iOr
7ec0: 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74  derByCol value t
7ed0: 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  o one more than 
7ee0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
7ef0: 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20   ORDER BY .     
7f00: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
7f10: 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b  ithin the sort-k
7f20: 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f  ey that pushOnto
7f30: 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65  Sorter() will ge
7f40: 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a  nerate..      **
7f50: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
7f60: 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64   p->pEList field
7f70: 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66   to be omitted f
7f80: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72  rom the sorted r
7f90: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20  ecord,.      ** 
7fa0: 73 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64  saving space and
7fb0: 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f   CPU cycles.  */
7fc0: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
7fd0: 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c   |= (SQLITE_ECEL
7fe0: 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f  _OMITREF|SQLITE_
7ff0: 45 43 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20  ECEL_REF);.     
8000: 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f   for(i=pSort->nO
8010: 42 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70  BSat; i<pSort->p
8020: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8030: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
8040: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t j;.        if(
8050: 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72   (j = pSort->pOr
8060: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  derBy->a[i].u.x.
8070: 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
8080: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
8090: 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e  EList->a[j-1].u.
80a0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
80b0: 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  i+1-pSort->nOBSa
80c0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
80d0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
80e0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
80f0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
8100: 20 20 73 65 6c 65 63 74 45 78 70 72 44 65 66 65    selectExprDefe
8110: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
8120: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 45 78   p->pEList, &pEx
8130: 74 72 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tra);.      if( 
8140: 70 45 78 74 72 61 20 26 26 20 70 50 61 72 73 65  pExtra && pParse
8150: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8160: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
8170: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
8180: 20 61 6e 79 20 65 78 74 72 61 20 50 4b 20 63 6f   any extra PK co
8190: 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20 74 6f 20  lumns to add to 
81a0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
81b0: 64 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ds,.        ** a
81c0: 6c 6c 6f 63 61 74 65 20 65 78 74 72 61 20 6d 65  llocate extra me
81d0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 61  mory cells and a
81e0: 64 6a 75 73 74 20 74 68 65 20 4f 70 65 6e 45 70  djust the OpenEp
81f0: 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 20 20 20  hemeral .       
8200: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
8210: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
8220: 68 65 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64  he larger record
8230: 73 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a  s. This is only.
8240: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69          ** requi
8250: 72 65 64 20 69 66 20 74 68 65 72 65 20 61 72 65  red if there are
8260: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 49 54   one or more WIT
8270: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
8280: 73 20 77 69 74 68 0a 20 20 20 20 20 20 20 20 2a  s with.        *
8290: 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70 72 69 6d  * composite prim
82a0: 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ary keys in the 
82b0: 53 6f 72 74 43 74 78 2e 61 44 65 66 65 72 5b 5d  SortCtx.aDefer[]
82c0: 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20   array.  */.    
82d0: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
82e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
82f0: 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64  Op(v, pSort->add
8300: 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
8310: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 2b 3d 20       pOp->p2 += 
8320: 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d  (pExtra->nExpr -
8330: 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b   pSort->nDefer);
8340: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
8350: 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46  .pKeyInfo->nAllF
8360: 69 65 6c 64 20 2b 3d 20 28 70 45 78 74 72 61 2d  ield += (pExtra-
8370: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
8380: 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20  nDefer);.       
8390: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
83a0: 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a   pExtra->nExpr;.
83b0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
83c0: 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30       regOrig = 0
83d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
83e0: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c  eDest==SRT_Set |
83f0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
8400: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
8410: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8420: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
8430: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
8440: 20 7d 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f   }.    nResultCo
8450: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
8460: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
8470: 73 65 2c 70 2d 3e 70 45 4c 69 73 74 2c 72 65 67  se,p->pEList,reg
8480: 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20  Result,.        
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23   0,ecelFlags);.#
84c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
84d0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
84e0: 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 70 45  ENCES.    if( pE
84f0: 78 74 72 61 20 29 7b 0a 20 20 20 20 20 20 6e 52  xtra ){.      nR
8500: 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 73 71 6c 69  esultCol += sqli
8510: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
8520: 69 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 70  ist(.          p
8530: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 72  Parse, pExtra, r
8540: 65 67 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75  egResult + nResu
8550: 6c 74 43 6f 6c 2c 20 30 2c 20 30 0a 20 20 20 20  ltCol, 0, 0.    
8560: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
8570: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8580: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
8590: 74 72 61 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  tra);.    }.#end
85a0: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  if.  }..  /* If 
85b0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
85c0: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
85d0: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
85e0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
85f0: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
8600: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
8610: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
8620: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
8630: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
8640: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
8650: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
8660: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
8670: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
8680: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
8690: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
86a0: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
86b0: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
86c0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
86d0: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
86e0: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
86f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
8700: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
8710: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
8720: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
8730: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
8740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8750: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
8760: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
8770: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
8780: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
8790: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
87a0: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
87b0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
87c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
87d0: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
87e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
87f0: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
8800: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
8810: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
8820: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
8830: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
8840: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
8850: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
8860: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
8870: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
8880: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
8890: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
88a0: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
88b0: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
88c0: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
88d0: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
88e0: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
88f0: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
8900: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
8910: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
8920: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8930: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
8940: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
8950: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
8960: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
8970: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
8980: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
8990: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
89a0: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
89b0: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
89c0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
89d0: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
89e0: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
89f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8a00: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
8a10: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
8a20: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
8a30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
8a40: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8a50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
8a60: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
8a70: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
8a80: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
8a90: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
8aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8ab0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ac0: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
8ad0: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
8ae0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
8af0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
8b00: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
8b10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8b30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
8b40: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
8b50: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
8b60: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
8b70: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
8b80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
8b90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8ba0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
8bb0: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
8bc0: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
8bd0: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
8be0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8bf0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
8c00: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
8c10: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
8c20: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
8c30: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
8c40: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
8c50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8c60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8c70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8c80: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
8c90: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
8ca0: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
8cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8cc0: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
8cd0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
8ce0: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
8cf0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8d00: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
8d10: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
8d20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8d30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
8d40: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
8d50: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
8d60: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
8d70: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
8d80: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
8d90: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
8da0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
8db0: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
8dc0: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
8dd0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
8de0: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
8df0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
8e00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
8e10: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
8e20: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
8e30: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
8e40: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
8e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
8e60: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
8e70: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
8e80: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
8e90: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
8ea0: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
8eb0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
8ec0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
8ed0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8ee0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8ef0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
8f00: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
8f10: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
8f20: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8f30: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8f50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8f60: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
8f70: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8f80: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
8f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
8fa0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
8fb0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
8fc0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8fd0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
8fe0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
8ff0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9000: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9010: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
9020: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
9030: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
9040: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
9050: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
9060: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
9070: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
9080: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
9090: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
90a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
90b0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
90c0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
90d0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
90e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
90f0: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
9100: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
9110: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
9120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9130: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9140: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9150: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
9160: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
9170: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
9180: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
9190: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
91a0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
91b0: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
91c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
91d0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
91e0: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
91f0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
9200: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
9210: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
9220: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
9230: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
9240: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
9250: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9260: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
9270: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9280: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
9290: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
92a0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
92b0: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
92c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
92d0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
92e0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
92f0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
9300: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
9310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9320: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
9330: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
9340: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
9350: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
9360: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
9370: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
9380: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
9390: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
93a0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
93b0: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
93c0: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
93d0: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
93e0: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
93f0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
9400: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
9410: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
9420: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
9430: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
9440: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
9450: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
9460: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
9470: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
9480: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
9490: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
94a0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
94b0: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
94c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
94d0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
94e0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
94f0: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
9500: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
9510: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
9520: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9530: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9540: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
9550: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
9560: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
9570: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
9580: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
9590: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
95a0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
95b0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
95c0: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
95d0: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67  1+nPrefixReg,reg
95e0: 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78  Result,1,nPrefix
95f0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
9600: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
9610: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
9620: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
9630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9640: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9650: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
9660: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
9670: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9680: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
9690: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
96a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96b0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
96c0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
96d0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
96e0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
96f0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
9700: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9710: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
9720: 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78  rse, r1, nPrefix
9730: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72  Reg+1);.      br
9740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
9750: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9760: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
9770: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
9780: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
9790: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
97a0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
97b0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
97c0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
97d0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
97e0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
97f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
9800: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
9810: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
9820: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
9830: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
9840: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
9850: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
9860: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
9870: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
9880: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
9890: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
98a0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
98b0: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
98c0: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
98d0: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
98e0: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
98f0: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
9900: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
9910: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
9920: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
9930: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
9940: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
9950: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
9960: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
9970: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
9980: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
9990: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
99a0: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
99b0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
99c0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
99d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
99e0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
99f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9a00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
9a10: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d  est->zAffSdst)==
9a20: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20  nResultCol );.  
9a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9a40: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
9a50: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
9a60: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
9a70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31   .            r1
9a80: 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
9a90: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9ab0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
9ac0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
9ad0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
9ae0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
9af0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9b00: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9b10: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9b20: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
9b30: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
9b40: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
9b50: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
9b60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
9b80: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
9b90: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
9ba0: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
9bb0: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
9bc0: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
9bd0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
9be0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9bf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9c00: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
9c10: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
9c20: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
9c30: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
9c40: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
9c50: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
9c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
9c70: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
9c80: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
9c90: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
9ca0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
9cb0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
9cc0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
9cd0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
9ce0: 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20  ell or array of 
9cf0: 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  .    ** memory c
9d00: 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f  ells and break o
9d10: 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ut of the scan l
9d20: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
9d30: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
9d40: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
9d50: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9d60: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70  t( nResultCol<=p
9d70: 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20  Dest->nSdst );. 
9d80: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
9d90: 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20  orter(.         
9da0: 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74     pParse, pSort
9db0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
9dc0: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
9dd0: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
9de0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9df0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
9e00: 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74  ResultCol==pDest
9e10: 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20  ->nSdst );.     
9e20: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65     assert( regRe
9e30: 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20  sult==iParm );. 
9e40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
9e50: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
9e60: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
9e70: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
9e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9e90: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
9ea0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
9eb0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9ec0: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52   */..    case SR
9ed0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20  T_Coroutine:    
9ee0: 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20     /* Send data 
9ef0: 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  to a co-routine 
9f00: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9f10: 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20  Output: {       
9f20: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72   /* Return the r
9f30: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
9f40: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
9f50: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
9f60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
9f80: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
9f90: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
9fa0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
9fb0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
9fc0: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
9fd0: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
9fe0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
9ff0: 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69            nPrefi
a000: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
a010: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
a020: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
a030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a040: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
a050: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
a060: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
a070: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a080: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a090: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
a0a0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
a0b0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
a0c0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
a0d0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
a0e0: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
a0f0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a100: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a110: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
a120: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
a130: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
a140: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
a150: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
a160: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
a170: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
a180: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
a190: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
a1a0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
a1b0: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
a1c0: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
a1d0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
a1e0: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
a1f0: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
a200: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
a210: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
a220: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
a230: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
a240: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
a250: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
a260: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
a270: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
a280: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
a290: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
a2a0: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
a2b0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
a2c0: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
a2d0: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
a2e0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
a2f0: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
a300: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
a310: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
a320: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
a330: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
a340: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
a350: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
a360: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
a370: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
a380: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
a390: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a3a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
a3b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a3c0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
a3d0: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
a3e0: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
a3f0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
a400: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
a410: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
a420: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
a430: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
a440: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
a450: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
a460: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
a470: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
a480: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
a490: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
a4a0: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
a4b0: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
a4c0: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
a4d0: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
a4e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
a4f0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
a500: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
a540: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
a550: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a560: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
a570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a580: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
a590: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
a5a0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
a5b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
a5c0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
a5d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
a5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a5f0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a600: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
a610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a620: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
a630: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
a640: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
a650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
a660: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
a670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a680: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
a6b0: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
a6c0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
a6d0: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
a6f0: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
a700: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a710: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
a720: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
a730: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
a740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a750: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a760: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
a770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a780: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a790: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
a7a0: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
a7b0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
a7c0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
a7d0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a7e0: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
a7f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a800: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a810: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
a820: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
a830: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
a840: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
a850: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
a860: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
a870: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
a880: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a890: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
a8a0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
a8b0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
a8c0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
a8d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
a8e0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
a8f0: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
a900: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
a910: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
a920: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
a930: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
a940: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
a950: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
a960: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
a970: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
a980: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
a990: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
a9a0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
a9b0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
a9c0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
a9d0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
a9e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
a9f0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
aa00: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
aa10: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
aa20: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
aa30: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
aa40: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
aa50: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
aa60: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
aa70: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
aa80: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
aa90: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
aaa0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
aab0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
aac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aad0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
aae0: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
aaf0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
ab00: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ab10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
ab20: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
ab30: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
ab40: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
ab50: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
ab60: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
ab70: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
ab80: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
ab90: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
aba0: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
abb0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
abc0: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
abd0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
abe0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
abf0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
ac00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
ac10: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
ac20: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
ac30: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
ac40: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
ac50: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
ac60: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
ac70: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
ac80: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
ac90: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
aca0: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
acb0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
acc0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
acd0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
ace0: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
acf0: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
ad00: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
ad10: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
ad20: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
ad30: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
ad40: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
ad50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
ad60: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
ad70: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
ad80: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
ad90: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
ada0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
adb0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
adc0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
add0: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
ade0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
adf0: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
ae00: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
ae10: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
ae20: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
ae30: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
ae40: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ae50: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
ae60: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
ae70: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
ae80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
ae90: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
aea0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
aeb0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
aec0: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
aed0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
aee0: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
aef0: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
af00: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
af10: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
af20: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
af30: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
af40: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
af50: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
af60: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
af70: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
af80: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
af90: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
afa0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
afb0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
afc0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
afd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
afe0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
aff0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
b000: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
b010: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
b020: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
b030: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
b040: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
b050: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
b060: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
b070: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
b080: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
b090: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
b0a0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
b0b0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
b0c0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
b0d0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
b0e0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
b0f0: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
b100: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
b110: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
b120: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
b130: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
b140: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
b150: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
b160: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
b170: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
b180: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
b190: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
b1a0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
b1b0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
b1c0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
b1d0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
b1e0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
b1f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
b200: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
b210: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
b220: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
b230: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
b240: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
b250: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
b260: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
b270: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
b280: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b290: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
b2a0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
b2b0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
b2c0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
b2d0: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
b2e0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
b2f0: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
b300: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
b310: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
b320: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
b330: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
b340: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
b350: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
b360: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
b370: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
b380: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
b390: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
b3a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b3b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
b3c0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
b3d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
b3e0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
b3f0: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
b400: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
b410: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
b420: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
b430: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
b440: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
b450: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
b460: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
b470: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
b480: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
b490: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
b4a0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
b4b0: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
b4c0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
b4d0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
b4e0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
b4f0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
b500: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
b510: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
b520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
b530: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
b540: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
b550: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
b560: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
b570: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
b580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
b590: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
b5a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
b5b0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
b5c0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
b5d0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
b5e0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
b5f0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
b600: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
b610: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
b620: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
b630: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
b640: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
b650: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
b660: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
b670: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
b680: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
b690: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b6a0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
b6b0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
b6c0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
b6d0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
b6e0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
b6f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
b700: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
b710: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
b720: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
b730: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
b740: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
b750: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
b760: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
b770: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
b780: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
b790: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
b7a0: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
b7b0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
b7c0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
b7d0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
b7e0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
b7f0: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
b800: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
b810: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
b820: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
b830: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
b840: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 45  ar *zUsage){.  E
b850: 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
b860: 28 70 50 61 72 73 65 2c 20 30 2c 20 22 55 53 45  (pParse, 0, "USE
b870: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
b880: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 29 3b 0a   %s", zUsage));.
b890: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
b8a0: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
b8b0: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
b8c0: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
b8d0: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
b8e0: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
b8f0: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
b900: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
b910: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
b920: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
b930: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
b940: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
b950: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
b960: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
b970: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
b980: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
b990: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
b9a0: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
b9b0: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
b9c0: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
b9d0: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
b9e0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
b9f0: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
ba00: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
ba10: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
ba20: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
ba30: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
ba40: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
ba50: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
ba60: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
ba70: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
ba80: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
ba90: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ndif.../*.** If 
baa0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
bab0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
bac0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
bad0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
bae0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
baf0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
bb00: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
bb10: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
bb20: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
bb30: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
bb40: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
bb50: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
bb60: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
bb70: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
bb80: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
bb90: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
bba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bbb0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
bbc0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
bbd0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
bbe0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
bbf0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
bc00: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
bc10: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72  atement */.  Sor
bc20: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f  tCtx *pSort,   /
bc30: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  * Information on
bc40: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
bc50: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ause */.  int nC
bc60: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
bc70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
bc80: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
bc90: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
bca0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
bcb0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
bcc0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
bcd0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
bd00: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
bd10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
bd20: 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65  ak = pSort->labe
bd30: 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20  lDone;          
bd40: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
bd50: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
bd60: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
bd70: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
bd80: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
bd90: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
bda0: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
bdb0: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bdd0: 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70 75 74 20  * Top of output 
bde0: 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f 72 20 4e  loop. Jump for N
bdf0: 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ext. */.  int ad
be00: 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e  drOnce = 0;.  in
be10: 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69  t iTab;.  ExprLi
be20: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
be30: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Sort->pOrderBy;.
be40: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
be50: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
be60: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
be70: 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20  >iSDParm;.  int 
be80: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
be90: 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43  gRowid;.  int iC
bea0: 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20  ol;.  int nKey; 
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bed0: 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
bee0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
bef0: 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61  */.  int iSortTa
bf00: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
bf10: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
bf20: 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72  ursor to read fr
bf30: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  om */.  int i;. 
bf40: 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20   int bSeq;      
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74   /* True if sort
bf70: 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64  er record includ
bf80: 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20  es seq. no. */. 
bf90: 20 69 6e 74 20 6e 52 65 66 4b 65 79 20 3d 20 30   int nRefKey = 0
bfa0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
bfb0: 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78  ist_item *aOutEx
bfc0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b   = p->pEList->a;
bfd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ..  assert( addr
bfe0: 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28  Break<0 );.  if(
bff0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
c000: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
c010: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c020: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
c030: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
c040: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
c050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
c060: 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  to(v, addrBreak)
c070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c080: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c090: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
c0a0: 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ut);.  }..#ifdef
c0b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c0c0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
c0d0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 79 20 63  .  /* Open any c
c0e0: 75 72 73 6f 72 73 20 6e 65 65 64 65 64 20 66 6f  ursors needed fo
c0f0: 72 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  r sorter-referen
c100: 63 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  ce expressions *
c110: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
c120: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b  Sort->nDefer; i+
c130: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
c140: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Tab = pSort->aDe
c150: 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  fer[i].pTab;.   
c160: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
c170: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c180: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
c190: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c1a0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
c1b0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
c1c0: 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 2c 20  aDefer[i].iCsr, 
c1d0: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
c1e0: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 6e 52 65  enRead);.    nRe
c1f0: 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52 65 66 4b  fKey = MAX(nRefK
c200: 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  ey, pSort->aDefe
c210: 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a  r[i].nKey);.  }.
c220: 23 65 6e 64 69 66 0a 0a 20 20 69 54 61 62 20 3d  #endif..  iTab =
c230: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
c240: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
c250: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
c260: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
c270: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
c280: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  Mem ){.    regRo
c290: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
c2a0: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
c2b0: 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
c2c0: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
c2d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
c2e0: 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f  arse);.    regRo
c2f0: 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  w = sqlite3GetTe
c300: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
c310: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20  nColumn);.  }.  
c320: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
c330: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
c340: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
c350: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
c360: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
c370: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
c380: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
c390: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c3a0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
c3b0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
c3c0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
c3d0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
c3e0: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
c3f0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c400: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
c410: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
c420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c430: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
c440: 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c  seudo, iSortTab,
c450: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 0a 20 20   regSortOut, .  
c460: 20 20 20 20 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f        nKey+1+nCo
c470: 6c 75 6d 6e 2b 6e 52 65 66 4b 65 79 29 3b 0a 20  lumn+nRefKey);. 
c480: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
c490: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
c4a0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
c4b0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
c4c0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
c4d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
c4e0: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
c4f0: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
c500: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c510: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
c520: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
c530: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
c540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c550: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
c560: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
c570: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
c580: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
c590: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
c5a0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
c5b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
c5c0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
c5d0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
c5e0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
c5f0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
c600: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
c610: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
c620: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
c630: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
c640: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
c650: 62 53 65 71 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d  bSeq-1; i<nColum
c660: 6e 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20  n; i++){.#ifdef 
c670: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
c680: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
c690: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
c6a0: 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29 20 63  ].bSorterRef ) c
c6b0: 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a  ontinue;.#endif.
c6c0: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
c6d0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
c6e0: 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20  l==0 ) iCol++;. 
c6f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
c700: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
c710: 45 46 45 52 45 4e 43 45 53 0a 20 20 69 66 28 20  EFERENCES.  if( 
c720: 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 29 7b  pSort->nDefer ){
c730: 0a 20 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20  .    int iKey = 
c740: 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 69 6e 74 20  iCol+1;.    int 
c750: 72 65 67 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  regKey = sqlite3
c760: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
c770: 72 73 65 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 0a  rse, nRefKey);..
c780: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c790: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b  Sort->nDefer; i+
c7a0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
c7b0: 73 72 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66  sr = pSort->aDef
c7c0: 65 72 5b 69 5d 2e 69 43 73 72 3b 0a 20 20 20 20  er[i].iCsr;.    
c7d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c7e0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
c7f0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  .pTab;.      int
c800: 20 6e 4b 65 79 20 3d 20 70 53 6f 72 74 2d 3e 61   nKey = pSort->a
c810: 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a  Defer[i].nKey;..
c820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c830: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
c840: 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20  llRow, iCsr);.  
c850: 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
c860: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
c870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c880: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
c890: 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79  , iSortTab, iKey
c8a0: 2b 2b 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  ++, regKey);.   
c8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c8c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
c8d0: 6b 52 6f 77 69 64 2c 20 69 43 73 72 2c 20 0a 20  kRowid, iCsr, . 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c8f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
c900: 72 28 76 29 2b 31 2c 20 72 65 67 4b 65 79 29 3b  r(v)+1, regKey);
c910: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c920: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
c930: 20 20 20 20 20 69 6e 74 20 69 4a 6d 70 3b 0a 20       int iJmp;. 
c940: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
c950: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
c960: 49 6e 64 65 78 28 70 54 61 62 29 2d 3e 6e 4b 65  Index(pTab)->nKe
c970: 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  yCol==nKey );.  
c980: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
c990: 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  <nKey; k++){.   
c9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c9b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
c9c0: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
c9d0: 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 2b   iKey++, regKey+
c9e0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
c9f0: 20 20 20 20 20 20 69 4a 6d 70 20 3d 20 73 71 6c        iJmp = sql
ca00: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
ca10: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
ca20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ca30: 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47  4Int(v, OP_SeekG
ca40: 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b 32 2c  E, iCsr, iJmp+2,
ca50: 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a   regKey, nKey);.
ca60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ca70: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
ca80: 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c 20  OP_IdxLE, iCsr, 
ca90: 69 4a 6d 70 2b 33 2c 20 72 65 67 4b 65 79 2c 20  iJmp+3, regKey, 
caa0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73  nKey);.        s
cab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
cac0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
cad0: 69 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iCsr);.      }. 
cae0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
caf0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
cb00: 28 70 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c  (pParse, regKey,
cb10: 20 6e 52 65 66 4b 65 79 29 3b 0a 20 20 7d 0a 23   nRefKey);.  }.#
cb20: 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 6e 43  endif.  for(i=nC
cb30: 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69  olumn-1; i>=0; i
cb40: 2d 2d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  --){.#ifdef SQLI
cb50: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
cb60: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
cb70: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
cb80: 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20  orterRef ){.    
cb90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
cba0: 65 28 70 50 61 72 73 65 2c 20 61 4f 75 74 45 78  e(pParse, aOutEx
cbb0: 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65 67 52 6f  [i].pExpr, regRo
cbc0: 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  w+i);.    }else.
cbd0: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
cbe0: 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20     int iRead;.  
cbf0: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
cc00: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
cc10: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 65  l ){.        iRe
cc20: 61 64 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75  ad = aOutEx[i].u
cc30: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
cc40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cc50: 20 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 69         iRead = i
cc60: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Col--;.      }. 
cc70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cc80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
cc90: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
cca0: 52 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b  Read, regRow+i);
ccb0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
ccc0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75  nt((v, "%s", aOu
ccd0: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75  tEx[i].zName?aOu
cce0: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61  tEx[i].zName : a
ccf0: 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29  OutEx[i].zSpan))
cd00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77  ;.    }.  }.  sw
cd10: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
cd20: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
cd30: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
cd40: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
cd50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd60: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
cd70: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
cd80: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
cd90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cda0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
cdb0: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
cdc0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
cdd0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
cde0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
cdf0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ce00: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ce10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
ce20: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
ce30: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
ce40: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
ce50: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
ce60: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
ce70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ce80: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ce90: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
cea0: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
ceb0: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ced0: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
cee0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
cef0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
cf00: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
cf10: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e  Parse, regRow, n
cf20: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
cf30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
cf40: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
cf50: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
cf60: 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  owid, regRow, nC
cf70: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
cf80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
cf90: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
cfa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
cfb0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
cfc0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
cfd0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
cfe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
cff0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
d000: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
d010: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
d020: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
d030: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
d040: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d050: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
d060: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
d070: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
d080: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
d090: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
d0a0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
d0b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d0c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
d0d0: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
d0e0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
d0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d100: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
d110: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
d120: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
d130: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
d140: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
d150: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d160: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
d170: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
d180: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d1a0: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
d1b0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
d1c0: 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  et ){.      sqli
d1d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
d1e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
d1f0: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
d200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
d210: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d220: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
d230: 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Row);.    }.    
d240: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d250: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
d260: 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f  gRowid);.  }.  /
d270: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
d280: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
d290: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d2a0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
d2b0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
d2c0: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
d2d0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
d2e0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
d2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d300: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
d310: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
d320: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
d340: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d350: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
d360: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
d370: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
d380: 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  ( pSort->regRetu
d390: 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rn ) sqlite3Vdbe
d3a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
d3b0: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  urn, pSort->regR
d3c0: 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65  eturn);.  sqlite
d3d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d3e0: 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
d3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d400: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
d410: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
d420: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
d430: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
d440: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
d450: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
d460: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
d470: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
d480: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  caller..**.** Al
d490: 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  so try to estima
d4a0: 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
d4b0: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
d4c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  e and return tha
d4d0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a  t.** result in *
d4e0: 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a  pEstWidth..**.**
d4f0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
d500: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
d510: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
d520: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
d530: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
d540: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
d550: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
d560: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
d570: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
d580: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
d590: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
d5a0: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
d5b0: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
d5c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
d5d0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
d5e0: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
d5f0: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
d600: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
d610: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
d620: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
d630: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
d640: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
d650: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
d660: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
d670: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
d680: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
d690: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
d6a0: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
d6b0: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
d6c0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
d6d0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
d6e0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
d6f0: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
d700: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
d710: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
d720: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
d730: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
d740: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
d750: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
d760: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
d770: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
d780: 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70   either 3 or 6 p
d790: 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64  arameters depend
d7a0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
d7b0: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c  r not.** the SQL
d7c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
d7d0: 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69  N_METADATA compi
d7e0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
d7f0: 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  s used..*/.#ifde
d800: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d810: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
d820: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
d830: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63  ype(A,B,C,D,E) c
d840: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
d850: 42 2c 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f  B,C,D,E).#else /
d860: 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  * if !defined(SQ
d870: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
d880: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
d890: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
d8a0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63  ype(A,B,C,D,E) c
d8b0: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
d8c0: 42 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  B).#endif.static
d8d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
d8e0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
d8f0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
d900: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
d910: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d920: 45 54 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a  ETADATA.  Expr *
d930: 70 45 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78  pExpr.#else.  Ex
d940: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
d950: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
d960: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
d970: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
d980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
d990: 72 69 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b  rigCol.#endif.){
d9a0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
d9b0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
d9c0: 6a 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  j;.#ifdef SQLITE
d9d0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d9e0: 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63  ETADATA.  char c
d9f0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20  onst *zOrigDb = 
da00: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
da10: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
da20: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
da30: 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  igCol = 0;.#endi
da40: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f..  assert( pEx
da50: 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pr!=0 );.  asser
da60: 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
da70: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
da80: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
da90: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a  GG_COLUMN );  /*
daa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
dab0: 6e 65 73 20 62 65 66 6f 72 65 20 61 67 67 72 65  nes before aggre
dac0: 67 61 74 65 73 0a 20 20 20 20 20 20 20 20 20 20  gates.          
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
daf0: 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  are processed */
db00: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
db10: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
db20: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
db30: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
db40: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
db50: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
db60: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
db70: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
db80: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
db90: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
dba0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
dbb0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
dbc0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
dbd0: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
dbe0: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
dbf0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
dc00: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
dc10: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
dc20: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
dc30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
dc40: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
dc50: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
dc60: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
dc70: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
dc80: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
dc90: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
dca0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
dcb0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
dcc0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
dcd0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
dce0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
dcf0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
dd00: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
dd10: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
dd20: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
dd30: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
dd40: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
dd50: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
dd60: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
dd70: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
dd80: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
dd90: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
dda0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
ddb0: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
ddc0: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
ddd0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
dde0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
ddf0: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
de00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
de10: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
de20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
de30: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
de40: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
de50: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
de60: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
de70: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
de80: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
de90: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
dea0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
deb0: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
dec0: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
ded0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
dee0: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
def0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
df00: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
df10: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
df20: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
df30: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
df40: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
df50: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
df60: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
df70: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
df80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
df90: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
dfa0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
dfb0: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
dfc0: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
dfd0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
dfe0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
dff0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
e000: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
e010: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
e020: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
e030: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
e040: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
e050: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
e060: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
e070: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
e080: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
e090: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
e0a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
e0b0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
e0c0: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
e0d0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
e0e0: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
e0f0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
e100: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
e110: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
e120: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
e130: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
e140: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
e150: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
e160: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
e170: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
e180: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
e190: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
e1a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e1b0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
e1c0: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
e1d0: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
e1e0: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
e1f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
e200: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
e210: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
e220: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
e230: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
e240: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
e250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
e260: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
e270: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
e280: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
e290: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
e2a0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
e2b0: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
e2c0: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
e2d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
e2e0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e  >=0 && iCol<pS->
e2f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
e300: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
e310: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
e320: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
e330: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
e340: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
e350: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
e360: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
e370: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
e380: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
e390: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
e3a0: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
e3b0: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
e3c0: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
e3d0: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
e3e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
e3f0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
e400: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
e410: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
e420: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
e430: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
e440: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
e450: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
e460: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
e470: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
e480: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
e490: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
e4a0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
e4b0: 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26  NC, p,&zOrigDb,&
e4c0: 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43  zOrigTab,&zOrigC
e4d0: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
e4e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4f0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
e500: 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61  able or a CTE ta
e510: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
e520: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69  ssert( !pS );.#i
e530: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e540: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
e550: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
e560: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
e570: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
e580: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
e590: 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69  ==XN_ROWID || (i
e5a0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
e5b0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
e5c0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
e5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
e5e0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
e5f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
e600: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
e610: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e620: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
e630: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
e640: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
e650: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c       zType = sql
e660: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26  ite3ColumnType(&
e670: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
e680: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ,0);.        }. 
e690: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
e6a0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
e6b0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
e6c0: 70 50 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e  pParse && pTab->
e6d0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
e6e0: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
e6f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
e700: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
e710: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
e720: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
e730: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
e740: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
e750: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
e760: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
e770: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
e780: 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28  l==XN_ROWID || (
e790: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
e7a0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
e7b0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
e7c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
e7d0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
e7e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e7f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
e800: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
e810: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
e820: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
e830: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
e840: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e850: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
e860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
e870: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
e880: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
e890: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
e8a0: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
e8b0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
e8c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
e8d0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
e8e0: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
e8f0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
e900: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e910: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
e920: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
e930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e940: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
e950: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
e960: 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  pS = pExpr->x.pS
e970: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
e980: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
e990: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
e9a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
e9b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
e9c0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
e9d0: 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ) );.      sNC.p
e9e0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
e9f0: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
ea00: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
ea10: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
ea20: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
ea30: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
ea40: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
ea50: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
ea60: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  , &zOrigCol); . 
ea70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ea80: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
ea90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eaa0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
eab0: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
eac0: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
ead0: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
eae0: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
eaf0: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
eb00: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
eb10: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
eb20: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
eb30: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
eb40: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
eb50: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
eb60: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
eb70: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
eb80: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
eb90: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
eba0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
ebb0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
ebc0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
ebd0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
ebe0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ebf0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
ec00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
ec10: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
ec20: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
ec30: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
ec40: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
ec50: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
ec60: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
ec70: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
ec80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
ec90: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
eca0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ecb0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
ecc0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
ecd0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
ece0: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
ecf0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
ed00: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
ed10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
ed20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ed30: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
ed40: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
ed50: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
ed60: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
ed70: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ed80: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
ed90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
eda0: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
edb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
edc0: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
edd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
ede0: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
edf0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
ee00: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
ee10: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
ee20: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
ee30: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
ee40: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
ee50: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
ee60: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
ee70: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
ee80: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
ee90: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
eea0: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
eeb0: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
eec0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
eed0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
eee0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
eef0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ef00: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
ef10: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
ef20: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
ef30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ef40: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
ef50: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
ef60: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
ef70: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
ef80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ef90: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
efa0: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
efb0: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
efc0: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
efd0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
efe0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
eff0: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
f000: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f010: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
f020: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
f030: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
f040: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
f050: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
f060: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f070: 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a  DECLTYPE) */.}..
f080: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
f090: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f0a0: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
f0b0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
f0c0: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
f0d0: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
f0e0: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
f0f0: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
f100: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
f110: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
f120: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
f130: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
f140: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
f150: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
f160: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
f170: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
f180: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
f190: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
f1a0: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
f1b0: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
f1c0: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
f1d0: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
f1e0: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
f1f0: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
f200: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
f210: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
f220: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
f230: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
f240: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
f250: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
f260: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
f270: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73  *.** See Also: s
f280: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
f290: 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a  mExprList().**.*
f2a0: 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f  * The PRAGMA sho
f2b0: 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20  rt_column_names 
f2c0: 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f  and PRAGMA full_
f2d0: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74  column_names set
f2e0: 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70  tings are.** dep
f2f0: 72 65 63 61 74 65 64 2e 20 20 54 68 65 20 64 65  recated.  The de
f300: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73  fault setting is
f310: 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
f320: 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61  OFF.  99.9% of a
f330: 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ll.** applicatio
f340: 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74  ns should operat
f350: 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76  e this way.  Nev
f360: 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65  ertheless, we ne
f370: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68  ed to support th
f380: 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73  e.** other modes
f390: 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a   for legacy:.**.
f3a0: 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c  **    short=OFF,
f3b0: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
f3c0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74  Column name is t
f3d0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 65  he text of the e
f3e0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74  xpression has it
f3f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65   originally appe
f420: 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ars in the SELEC
f430: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  T statement.  In
f440: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
f470: 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72  e zSpan of the r
f480: 65 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e  esult expression
f490: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  ..**.**    short
f4a0: 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20  =ON, full=OFF:  
f4b0: 20 20 20 20 20 28 54 68 69 73 20 69 73 20 74 68       (This is th
f4c0: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
f4d0: 67 29 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  g).  If the resu
f4e0: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 72 65 66 65 72 73 20 64 69 72 65 63 74     refers direct
f510: 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f  ly to a table co
f520: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a  lumn, then the.*
f530: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
f550: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
f560: 65 20 69 73 20 6a 75 73 74 20 74 68 65 20 74 61  e is just the ta
f570: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20  ble column.**   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a             name:
f5a0: 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77   COLUMN.  Otherw
f5b0: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
f5c0: 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c  *.**    full=ON,
f5d0: 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20   short=ANY:     
f5e0: 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
f5f0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
f600: 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  to a table colum
f610: 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n,.**           
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75     then the resu
f640: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  lt column name w
f650: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
f660: 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  me.**           
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54     prefix, ex: T
f690: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74  ABLE.COLUMN.  Ot
f6a0: 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70 61  herwise use zSpa
f6b0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
f6c0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
f6d0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
f6e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
f6f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
f700: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
f710: 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ect     /* Gener
f720: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ate column names
f730: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
f740: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
f750: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
f760: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
f770: 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t i;.  Table *pT
f780: 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
f790: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
f7a0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
f7b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f7c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
f7d0: 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54  ullName;    /* T
f7e0: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
f7f0: 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
f800: 69 73 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  is a direct tabl
f810: 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73  e ref */.  int s
f820: 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43  rcName;     /* C
f830: 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43  OLUMN or TABLE.C
f840: 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63  OLUMN if no AS c
f850: 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64 69 72  lause and is dir
f860: 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ect */..#ifndef 
f870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
f880: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
f890: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
f8a0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
f8b0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
f8c0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
f8d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
f8e0: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
f8f0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
f900: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f910: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20   ) return;.  /* 
f920: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  Column names are
f930: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
f940: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
f950: 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  m of a compound 
f960: 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c  select */.  whil
f970: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
f980: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
f990: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
f9a0: 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
f9b0: 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c 28  pParse,pSelect,(
f9c0: 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c 75  "generating colu
f9d0: 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a 20  mn names\n"));. 
f9e0: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c   pTabList = pSel
f9f0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  ect->pSrc;.  pEL
fa00: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
fa10: 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
fa20: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
fa30: 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29  t( pTabList!=0 )
fa40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
fa50: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
fa60: 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  ullName = (db->f
fa70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
fa80: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
fa90: 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d    srcName = (db-
faa0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
fab0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
fac0: 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20  0 || fullName;. 
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
fae0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
faf0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
fb00: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
fb10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fb20: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
fb30: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20  ->a[i].pExpr;.. 
fb40: 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20     assert( p!=0 
fb50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
fb60: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
fb70: 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70  UMN );  /* Agg p
fb80: 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f  rocessing has no
fb90: 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20  t run yet */.   
fba0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
fbb0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
fbc0: 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f  pTab!=0 ); /* Co
fbd0: 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20 79  vering idx not y
fbe0: 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20  et coded */.    
fbf0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
fc00: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
fc10: 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65 20  /* An AS clause 
fc20: 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69 72  always takes fir
fc30: 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20  st priority */. 
fc40: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
fc50: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
fc60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
fc70: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fc80: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fc90: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
fca0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
fcb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
fcc0: 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d  rcName && p->op=
fcd0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
fce0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
fcf0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
fd00: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
fd10: 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54 61     pTab = p->pTa
fd20: 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
fd30: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
fd40: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
fd50: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
fd60: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
fd70: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
fd80: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
fd90: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
fda0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
fdb0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
fdc0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
fdd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
fde0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
fdf0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
fe00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66     }.      if( f
fe10: 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ullName ){.     
fe20: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
fe30: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
fe40: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
fe50: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
fe60: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
fe70: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
fe80: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fe90: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fea0: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
feb0: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
fec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fee0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fef0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
ff00: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
ff10: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
ff20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
ff30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
ff40: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
ff50: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
ff60: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
ff70: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
ff80: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
ff90: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
ffa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ffb0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ffc0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
ffd0: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
ffe0: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
fff0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
10000 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
10010 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
10020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
10030 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
10040 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  st (which is rea
10050 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lly the list of 
10060 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
10070 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73  hat form the res
10080 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
10090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63  ECT statement) c
100a0 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61  ompute appropria
100b0 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  te.** column nam
100c0 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  es for a table t
100d0 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  hat would hold t
100e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
100f0 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  st..**.** All co
10100 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20  lumn names will 
10110 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a  be unique..**.**
10120 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   Only the column
10130 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75   names are compu
10140 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79  ted.  Column.zTy
10150 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  pe, Column.zColl
10160 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  ,.** and other f
10170 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20  ields of Column 
10180 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
10190 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
101a0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
101b0 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
101c0 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
101d0 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55  urs,.** store NU
101e0 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64  LL in *paCol and
101f0 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64   0 in *pnCol and
10200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10210 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OMEM..**.** The 
10220 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
10230 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
10240 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10250 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
10260 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
10270 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
10280 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
10290 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
102a0 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
102b0 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
102c0 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
102d0 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
102e0 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
102f0 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
10300 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
10310 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
10320 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
10330 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
10340 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
10350 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
10360 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
10370 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
10380 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
10390 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
103a0 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
103b0 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
103c0 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
103d0 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e  ** See Also: gen
103e0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
103f0 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ().*/.int sqlite
10400 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
10410 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
10420 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
10430 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
10440 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
10450 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
10460 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
10470 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
10480 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
10490 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20  /.  i16 *pnCol, 
104a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
104b0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
104c0 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
104d0 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
104e0 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
104f0 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
10500 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
10510 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
10520 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10530 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10540 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
10550 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
10560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10570 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
10580 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20   u32 cnt;       
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105a0 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
105b0 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
105c0 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
105d0 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
105e0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
105f0 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
10600 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
10610 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
10620 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10630 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
10640 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10650 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
10660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10670 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
10680 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
106b0 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20   in zName[] */. 
106c0 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20 20   Hash ht;       
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106e0 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f  Hash table of co
106f0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20  lumn names */.. 
10700 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
10710 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c  (&ht);.  if( pEL
10720 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
10730 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
10740 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
10750 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
10760 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
10770 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
10780 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
10790 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c   );.    if( nCol
107a0 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d 20  >32767 ) nCol = 
107b0 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  32767;.  }else{.
107c0 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
107d0 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
107e0 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d    assert( nCol==
107f0 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a  (i16)nCol );.  *
10800 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
10810 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
10820 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
10830 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20  aCol; i<nCol && 
10840 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
10850 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  d; i++, pCol++){
10860 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
10870 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
10880 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
10890 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a     */.    if( (z
108a0 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
108b0 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
108c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
108d0 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
108e0 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
108f0 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
10900 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
10910 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
10920 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70     Expr *pColExp
10930 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
10940 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73  kipCollate(pELis
10950 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
10960 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
10970 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
10980 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
10990 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
109a0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
109b0 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
109c0 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
109d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
109e0 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ColExpr->op!=TK_
109f0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
10a00 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
10a10 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
10a20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
10a30 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
10a40 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
10a50 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
10a60 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
10a70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
10a80 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
10a90 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
10aa0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10ab0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
10ac0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
10ad0 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
10ae0 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
10af0 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  ame = iCol>=0 ? 
10b00 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
10b10 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
10b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10b30 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
10b40 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
10b50 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
10b60 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
10b70 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
10b80 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
10b90 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  e = pColExpr->u.
10ba0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
10bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
10bc0 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
10bd0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
10be0 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
10bf0 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
10c00 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
10c10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
10c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10c30 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
10c40 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
10c50 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
10c60 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
10c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  else{.      zNam
10c80 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
10c90 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22  tf(db,"column%d"
10ca0 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ,i+1);.    }..  
10cb0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
10cc0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
10cd0 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
10ce0 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
10cf0 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
10d00 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
10d10 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
10d20 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
10d30 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
10d40 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
10d50 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71  ile( zName && sq
10d60 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68  lite3HashFind(&h
10d70 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  t, zName)!=0 ){.
10d80 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
10d90 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
10da0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
10db0 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20  nName>0 ){.     
10dc0 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31     for(j=nName-1
10dd0 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ; j>0 && sqlite3
10de0 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d  Isdigit(zName[j]
10df0 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); j--){}.      
10e00 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d    if( zName[j]==
10e10 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b  ':' ) nName = j;
10e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
10e30 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
10e40 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a  rintf(db, "%.*z:
10e50 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  %u", nName, zNam
10e60 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
10e70 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c   if( cnt>3 ) sql
10e80 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
10e90 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e  sizeof(cnt), &cn
10ea0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  t);.    }.    pC
10eb0 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
10ec0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  e;.    sqlite3Co
10ed0 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
10ee0 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b  omName(0, pCol);
10ef0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  .    if( zName &
10f00 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  & sqlite3HashIns
10f10 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20  ert(&ht, zName, 
10f20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20  pCol)==pCol ){. 
10f30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
10f40 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ault(db);.    }.
10f50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
10f60 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69  hClear(&ht);.  i
10f70 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
10f80 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
10f90 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
10fa0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
10fb0 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
10fc0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
10fd0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10fe0 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
10ff0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
11000 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
11010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11020 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
11030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11040 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
11050 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
11060 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
11070 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
11080 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
11090 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
110a0 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
110b0 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
110c0 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
110d0 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
110e0 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
110f0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
11100 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
11110 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
11120 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
11130 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
11140 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
11150 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
11160 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
11170 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
11180 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
11190 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
111a0 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
111b0 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
111c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
111d0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
111e0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
111f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11200 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
11210 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
11220 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
11230 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
11240 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
11250 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
11260 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
11270 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
11280 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
11290 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
112a0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
112b0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
112c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
112d0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
112e0 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
112f0 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
11300 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
11310 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
11320 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11330 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *a;..  assert(
11340 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
11350 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
11360 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
11370 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
11380 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
11390 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e  >nCol==pSelect->
113a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
113b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
113c0 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
113d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
113e0 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
113f0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
11400 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
11410 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
11420 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
11430 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
11440 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
11450 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  pTab->aCol; i<pT
11460 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
11470 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  Col++){.    cons
11480 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
11490 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20     int n, m;.   
114a0 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b   p = a[i].pExpr;
114b0 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
114c0 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
114d0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f   0, 0, 0);.    /
114e0 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20  * pCol->szEst = 
114f0 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69  ... // Column si
11500 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43  ze est for SELEC
11510 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75  T tables never u
11520 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d  sed */.    pCol-
11530 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
11540 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
11550 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70  p);.    if( zTyp
11560 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73  e ){.      m = s
11570 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11580 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d  Type);.      n =
11590 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
115a0 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
115b0 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
115c0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
115d0 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43  locOrFree(db, pC
115e0 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32  ol->zName, n+m+2
115f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
11600 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  l->zName ){.    
11610 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c      memcpy(&pCol
11620 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54  ->zName[n+1], zT
11630 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20  ype, m+1);.     
11640 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
11650 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53  s |= COLFLAG_HAS
11660 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TYPE;.      }.  
11670 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c    }.    if( pCol
11680 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
11690 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
116a0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
116b0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
116c0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
116d0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
116e0 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
116f0 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  ol->zColl==0 ){.
11700 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
11710 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
11720 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
11730 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
11740 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
11750 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f  w = 1; /* Any no
11760 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72  n-zero value wor
11770 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ks */.}../*.** G
11780 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
11790 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
117a0 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
117b0 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
117c0 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
117d0 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
117e0 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
117f0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11800 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
11810 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
11820 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
11830 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
11840 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11850 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
11860 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
11870 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
11880 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
11890 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
118a0 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
118b0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
118c0 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
118d0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
118e0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
118f0 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
11900 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
11910 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
11920 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
11930 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
11940 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
11950 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
11960 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
11970 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
11980 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
11990 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
119a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
119b0 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65   0;.  }.  /* The
119c0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
119d0 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f  tOfSelect() is o
119e0 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65  nly used n conte
119f0 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73  xts where lookas
11a00 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ide.  ** is disa
11a10 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  bled */.  assert
11a20 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
11a30 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54  bDisable );.  pT
11a40 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
11a50 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
11a60 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
11a70 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
11a80 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
11a90 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
11aa0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ) );.  sqlite3Co
11ab0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
11ac0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
11ad0 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
11ae0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
11af0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Col);.  sqlite3S
11b00 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
11b10 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
11b20 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
11b30 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
11b40 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
11b50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11b60 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
11b70 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
11b80 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
11b90 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
11ba0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
11bb0 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
11bc0 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
11bd0 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
11be0 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
11bf0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
11c00 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11c10 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
11c20 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
11c30 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
11c40 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
11c50 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
11c60 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
11c70 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72  ->pVdbe ){.    r
11c80 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56  eturn pParse->pV
11c90 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dbe;.  }.  if( p
11ca0 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
11cb0 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  ==0.   && Optimi
11cc0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
11cd0 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f  arse->db,SQLITE_
11ce0 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a  FactorOutConst).
11cf0 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d    ){.    pParse-
11d00 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
11d10 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
11d20 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
11d30 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  te(pParse);.}...
11d40 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
11d50 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
11d60 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
11d70 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
11d80 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
11d90 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
11da0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
11db0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
11dc0 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
11dd0 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
11de0 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
11df0 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
11e00 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
11e10 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
11e20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
11e30 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
11e40 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
11e50 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
11e60 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
11e70 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
11e80 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
11e90 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
11ea0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
11eb0 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
11ec0 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
11ed0 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
11ee0 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
11ef0 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
11f00 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
11f10 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
11f20 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
11f30 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
11f40 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
11f50 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
11f60 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
11f70 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
11f80 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20  imit->pLeft and 
11f90 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20  pLimit->pRight. 
11fa0 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69   iLimit.** and i
11fb0 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
11fc0 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
11fd0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
11fe0 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
11ff0 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
12000 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
12010 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
12020 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
12030 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
12040 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
12050 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
12060 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
12070 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
12080 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
12090 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
120a0 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
120b0 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
120c0 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
120d0 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
120e0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d   pLimit->pLeft!=
120f0 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
12100 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
12110 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
12120 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
12130 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
12140 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
12150 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
12160 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
12170 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
12180 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
12190 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
121a0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
121b0 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
121c0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
121d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
121e0 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
121f0 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
12200 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
12210 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
12220 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  set;.  int n;.  
12230 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
12240 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28  ->pLimit;..  if(
12250 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
12260 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
12270 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
12280 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
12290 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
122a0 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
122b0 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
122c0 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
122d0 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
122e0 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
122f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
12300 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
12310 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
12320 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
12330 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12340 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
12350 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20   if( pLimit ){. 
12360 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69     assert( pLimi
12370 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20  t->op==TK_LIMIT 
12380 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12390 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20  Limit->pLeft!=0 
123a0 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  );.    p->iLimit
123b0 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
123c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
123d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
123e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
123f0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
12400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12410 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69  xprIsInteger(pLi
12420 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20  mit->pLeft, &n) 
12430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12450 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
12460 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
12470 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
12480 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
12490 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
124a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
124b0 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
124c0 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
124d0 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
124e0 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
124f0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
12500 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
12510 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
12520 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
12530 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
12540 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
12550 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
12560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12570 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12580 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74  e(pParse, pLimit
12590 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29  ->pLeft, iLimit)
125a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
125b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
125c0 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
125d0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
125e0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
125f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
12600 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
12610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12620 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
12630 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  t, iLimit, iBrea
12640 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
12650 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
12660 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  f( pLimit->pRigh
12670 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
12680 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
12690 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
126a0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
126b0 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
126c0 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
126d0 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
126e0 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
126f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12700 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74  e(pParse, pLimit
12710 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65  ->pRight, iOffse
12720 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12730 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12740 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
12750 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
12760 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
12770 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
12780 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
12790 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
127a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
127b0 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69  OffsetLimit, iLi
127c0 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20  mit, iOffset+1, 
127d0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
127e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
127f0 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
12800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
12810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12820 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
12830 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
12840 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
12850 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
12860 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
12870 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
12880 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
12890 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
128a0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
128b0 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
128c0 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
128d0 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
128e0 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
128f0 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
12900 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
12910 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
12920 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
12930 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
12940 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
12950 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
12960 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
12970 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
12980 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
12990 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
129a0 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
129b0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
129c0 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
129d0 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
129e0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
129f0 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
12a00 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
12a10 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
12a20 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
12a30 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
12a40 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
12a50 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75   );.  /* iCol mu
12a60 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  st be less than 
12a70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
12a80 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  .  Otherwise an 
12a90 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a  error would.  **
12aa0 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77   have been throw
12ab0 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65  n during name re
12ac0 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20  solution and we 
12ad0 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67  would not have g
12ae0 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  otten.  ** this 
12af0 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65  far */.  if( pRe
12b00 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  t==0 && ALWAYS(i
12b10 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
12b20 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65  Expr) ){.    pRe
12b30 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
12b40 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12b50 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
12b60 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
12b70 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
12b80 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
12b90 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
12ba0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
12bb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63  parameter is a c
12bc0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a  ompound SELECT.*
12bd0 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  * with an ORDER 
12be0 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20  BY clause. This 
12bf0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
12c00 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
12c10 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75   KeyInfo.** stru
12c20 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66  cture suitable f
12c30 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  or implementing 
12c40 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a  the ORDER BY..**
12c50 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
12c60 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
12c70 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
12c80 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
12c90 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
12ca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
12cb0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
12cc0 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  ring that this s
12cd0 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
12ce0 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
12cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
12d00 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f  fo *multiSelectO
12d10 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61  rderByKeyInfo(Pa
12d20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
12d30 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74  ect *p, int nExt
12d40 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ra){.  ExprList 
12d50 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
12d60 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e  OrderBy;.  int n
12d70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
12d80 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
12d90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
12da0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49  arse->db;.  KeyI
12db0 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  nfo *pRet = sqli
12dc0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
12dd0 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78  db, nOrderBy+nEx
12de0 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  tra, 1);.  if( p
12df0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
12e00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12e10 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
12e20 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
12e30 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
12e40 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e  em = &pOrderBy->
12e50 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72  a[i];.      Expr
12e60 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d   *pTerm = pItem-
12e70 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f  >pExpr;.      Co
12e80 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
12e90 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
12ea0 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
12eb0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  te ){.        pC
12ec0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
12ed0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
12ee0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
12ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
12f00 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
12f10 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
12f20 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69   p, pItem->u.x.i
12f30 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20  OrderByCol-1);. 
12f40 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
12f50 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  ==0 ) pColl = db
12f60 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
12f70 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
12f80 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20  [i].pExpr =.    
12f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12fa0 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
12fb0 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  g(pParse, pTerm,
12fc0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
12fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
12fe0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
12ff0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
13000 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70  pRet) );.      p
13010 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Ret->aColl[i] = 
13020 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65  pColl;.      pRe
13030 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  t->aSortOrder[i]
13040 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
13050 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
13060 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
13070 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
13080 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
13090 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
130a0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56  tine generates V
130b0 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  DBE code to comp
130c0 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ute the content 
130d0 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53  of a WITH RECURS
130e0 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20  IVE.** query of 
130f0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
13100 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62    <recursive-tab
13110 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71  le> AS (<setup-q
13120 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c  uery> UNION [ALL
13130 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65  ] <recursive-que
13140 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ry>).**         
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  \___________/   
13170 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
13180 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69           p->pPri
131b0 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
131c0 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a          p.**.**.
131d0 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63  ** There is exac
131e0 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  tly one referenc
131f0 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69  e to the recursi
13200 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ve-table in the 
13210 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f  FROM clause.** o
13220 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  f recursive-quer
13230 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74  y, marked with t
13240 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e  he SrcList->a[].
13250 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 66  fg.isRecursive f
13260 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  lag..**.** The s
13270 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20  etup-query runs 
13280 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65  once to generate
13290 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20   an initial set 
132a0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a  of rows that go.
132b0 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20  ** into a Queue 
132c0 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65  table.  Rows are
132d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
132e0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
132f0 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20  one by.** one.  
13300 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74  Each row extract
13310 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73  ed from Queue is
13320 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
13330 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67  .  Then the sing
13340 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  le.** extracted 
13350 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20  row (now in the 
13360 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20  iCurrent table) 
13370 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74  becomes the cont
13380 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  ent of the.** re
13390 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f  cursive-table fo
133a0 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75  r a recursive-qu
133b0 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75  ery run.  The ou
133c0 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75  tput of the recu
133d0 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69  rsive-query.** i
133e0 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74  s added back int
133f0 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
13400 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72  e.  Then another
13410 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65   row is extracte
13420 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20  d from Queue.** 
13430 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f  and the iteratio
13440 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69  n continues unti
13450 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  l the Queue tabl
13460 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
13470 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  * If the compoun
13480 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72  d query operator
13490 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e   is UNION then n
134a0 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73  o duplicate rows
134b0 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73   are ever.** ins
134c0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51  erted into the Q
134d0 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
134e0 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65   iDistinct table
134f0 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66   keeps a copy of
13500 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61   all rows.** tha
13510 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e  t have ever been
13520 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51   inserted into Q
13530 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20  ueue and causes 
13540 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65  duplicates to be
13550 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20  .** discarded.  
13560 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  If the operator 
13570 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68  is UNION ALL, th
13580 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72  en duplicates ar
13590 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a  e allowed..** .*
135a0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68  * If the query h
135b0 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  as an ORDER BY, 
135c0 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20  then entries in 
135d0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
135e0 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f  are kept in.** O
135f0 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e  RDER BY order an
13600 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  d the first entr
13610 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  y is extracted f
13620 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20  or each cycle.  
13630 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52  Without.** an OR
13640 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75  DER BY, the Queu
13650 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20  e table is just 
13660 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66  a FIFO..**.** If
13670 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
13680 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65  is provided, the
13690 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  n the iteration 
136a0 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49  stops after LIMI
136b0 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62  T rows.** have b
136c0 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44  een output to pD
136d0 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66  est.  A LIMIT of
136e0 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f   zero means to o
136f0 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e  utput no rows an
13700 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20  d a.** negative 
13710 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f  LIMIT means to o
13720 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20  utput all rows. 
13730 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73   If there is als
13740 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  o an OFFSET clau
13750 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73  se.** with a pos
13760 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65  itive value, the
13770 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  n the first OFFS
13780 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64  ET outputs are d
13790 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a  iscarded rather.
137a0 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65  ** than being se
137b0 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  nt to pDest.  Th
137c0 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f  e LIMIT count do
137d0 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74  es not begin unt
137e0 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a  il after OFFSET.
137f0 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65  ** rows have bee
13800 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  n skipped..*/.st
13810 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
13820 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
13830 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
13840 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13850 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13860 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13880 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
13890 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ECT to be coded 
138a0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
138b0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
138c0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
138d0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
138e0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
138f0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20  c = p->pSrc;    
13900 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
13910 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75  ause of the recu
13920 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
13930 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70   int nCol = p->p
13940 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f  EList->nExpr;  /
13950 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
13960 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72  mns in the recur
13970 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  sive table */.  
13980 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13990 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
139a0 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
139b0 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
139c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
139d0 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d  Select *pSetup =
139e0 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a   p->pPrior;   /*
139f0 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79   The setup query
13a00 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
13a10 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13a20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
13a30 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
13a40 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
13a50 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e  eak;      /* CON
13a60 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20  TINUE and BREAK 
13a70 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69  addresses */.  i
13a80 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b  nt iCurrent = 0;
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13aa0 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  The Current tabl
13ab0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75  e */.  int regCu
13ac0 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rrent;          
13ad0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13ae0 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74   holding Current
13af0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
13b00 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20  iQueue;         
13b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13b20 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a   Queue table */.
13b30 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20    int iDistinct 
13b40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13b50 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69  /* To ensure uni
13b60 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55  que results if U
13b70 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  NION */.  int eD
13b80 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20  est = SRT_Fifo; 
13b90 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
13ba0 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65  o write to Queue
13bb0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
13bc0 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20   destQueue;     
13bd0 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73      /* SelectDes
13be0 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65  t targetting the
13bf0 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a   Queue table */.
13c00 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
13c30 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
13c60 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
13c70 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
13c80 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
13c90 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
13ca0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20   Expr *pLimit;  
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13cc0 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e  * Saved LIMIT an
13cd0 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e  d OFFSET */.  in
13ce0 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f  t regLimit, regO
13cf0 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52  ffset;      /* R
13d00 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79  egisters used by
13d10 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
13d20 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  T */..  /* Obtai
13d30 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
13d40 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76  to do a recursiv
13d50 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  e query */.  if(
13d60 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13d70 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
13d80 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30  _RECURSIVE, 0, 0
13d90 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
13da0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
13db0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
13dc0 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68  T clauses, if th
13dd0 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64  ey exist */.  ad
13de0 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  drBreak = sqlite
13df0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13e00 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
13e10 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
13e20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
13e30 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
13e40 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
13e50 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  p, addrBreak);. 
13e60 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
13e70 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  mit;.  regLimit 
13e80 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
13e90 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
13ea0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
13eb0 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  it = 0;.  p->iLi
13ec0 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
13ed0 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
13ee0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
13ef0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
13f00 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
13f10 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
13f20 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
13f30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
13f40 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
13f50 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
13f60 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
13f70 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
13f80 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
13f90 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
13fa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
13fb0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
13fc0 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
13fd0 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
13fe0 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
13ff0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
14000 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
14010 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
14020 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
14030 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
14040 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
14050 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
14060 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
14070 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
14080 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
14090 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
140a0 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
140b0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
140c0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
140d0 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
140e0 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
140f0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
14100 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14110 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
14120 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
14130 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
14140 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
14150 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14160 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
14170 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
14180 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14190 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
141a0 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
141b0 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
141c0 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
141d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
141e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
141f0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
14200 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
14210 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
14220 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
14230 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
14240 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
14250 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
14260 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
14270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14280 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
14290 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
142a0 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
142b0 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
142e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
142f0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
14300 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
14310 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14330 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14340 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
14350 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
14360 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
14370 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
14380 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
14390 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
143a0 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
143b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
143c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
143d0 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
143e0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
143f0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
14400 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
14410 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
14420 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
14430 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
14440 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
14450 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
14460 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
14470 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
14480 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
14490 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
144a0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
144b0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
144c0 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
144d0 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
144e0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
144f0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
14500 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
14510 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
14520 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
14530 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
14540 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
14550 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
14560 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14570 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
14580 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
14590 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
145a0 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
145b0 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
145c0 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
145d0 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
145e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
145f0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
14600 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
14610 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
14620 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
14630 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14640 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14650 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
14660 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
14670 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
14680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
14690 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
146a0 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
146b0 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
146c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
146d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
146e0 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
146f0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
14700 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
14710 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
14720 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
14730 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14740 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
14750 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64  , regOffset, add
14760 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74  rCont);.  select
14770 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
14780 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20  , p, iCurrent,. 
14790 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74       0, 0, pDest
147a0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  , addrCont, addr
147b0 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65  Break);.  if( re
147c0 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  gLimit ){.    sq
147d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
147e0 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
147f0 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64  ro, regLimit, ad
14800 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64  drBreak);.    Vd
14810 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14820 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
14830 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14840 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a  addrCont);..  /*
14850 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63   Execute the rec
14860 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61  ursive SELECT ta
14870 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20  king the single 
14880 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61  row in Current a
14890 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  s.  ** the value
148a0 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69   for the recursi
148b0 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20  ve-table. Store 
148c0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
148d0 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20  he Queue..  */. 
148e0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
148f0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
14900 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14910 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14920 72 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67  recursive aggreg
14930 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20  ate queries not 
14940 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d  supported");.  }
14950 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72  else{.    p->pPr
14960 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ior = 0;.    sql
14970 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14980 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
14990 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
149a0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
149b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
149c0 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Setup;.  }..  /*
149d0 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
149e0 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
149f0 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
14a00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
14a10 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
14a20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
14a30 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
14a40 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
14a50 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
14a60 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
14a70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
14a80 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
14a90 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
14aa0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
14ab0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
14ac0 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  imit;.  return;.
14ad0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14ae0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
14af0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
14b00 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
14b10 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
14b20 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
14b30 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14b40 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14b50 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14b60 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14b70 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
14b80 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
14b90 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
14ba0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
14bb0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
14bc0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
14bd0 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
14be0 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
14bf0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
14c00 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
14c10 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
14c20 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
14c30 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
14c40 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
14c50 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
14c60 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
14c70 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
14c80 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
14c90 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
14ca0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
14cb0 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
14cc0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
14cd0 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
14ce0 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
14cf0 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
14d00 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
14d10 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69  **   (1) There i
14d20 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
14d30 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65  FSET or else the
14d40 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66  re is a LIMIT of
14d50 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20   exactly 1.**   
14d60 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72  (2) All terms ar
14d70 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20  e UNION ALL.**  
14d80 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f   (3) There is no
14d90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14da0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49  .**.** The "LIMI
14db0 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20  T of exactly 1" 
14dc0 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f  case of conditio
14dd0 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75  n (1) comes abou
14de0 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a  t when a VALUES.
14df0 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73  ** clause occurs
14e00 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65   within scalar e
14e10 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22  xpression (ex: "
14e20 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31  SELECT (VALUES(1
14e30 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a  ),(2),(3))")..**
14e40 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65   The sqlite3Code
14e50 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68  Subselect will h
14e60 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49  ave added the LI
14e70 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20  MIT 1 clause in 
14e80 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e  tht case..** Sin
14e90 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20  ce the limit is 
14ea0 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e  exactly 1, we on
14eb0 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75  ly need to evalu
14ec0 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  tes the left-mos
14ed0 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61  t VALUES..*/.sta
14ee0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
14ef0 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
14f00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14f10 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
14f20 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
14f30 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
14f40 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
14f50 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
14f60 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
14f70 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
14f80 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
14f90 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
14fa0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  sults */.){.  Se
14fb0 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20  lect *pPrior;.  
14fc0 53 65 6c 65 63 74 20 2a 70 52 69 67 68 74 6d 6f  Select *pRightmo
14fd0 73 74 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e 52  st = p;.  int nR
14fe0 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63  ow = 1;.  int rc
14ff0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
15000 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15010 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20  _MultiValue );. 
15020 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
15030 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
15040 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20  F_Values );.    
15050 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
15060 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d  K_ALL || (p->op=
15070 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d  =TK_SELECT && p-
15080 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20  >pPrior==0) );. 
15090 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
150a0 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c  ext==0 || p->pEL
150b0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70  ist->nExpr==p->p
150c0 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Next->pEList->nE
150d0 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70  xpr );.    if( p
150e0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72  ->pPrior==0 ) br
150f0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
15100 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78   p->pPrior->pNex
15110 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20  t==p );.    p = 
15120 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e  p->pPrior;.    n
15130 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  Row++;.  }while(
15140 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  1);.  while( p )
15150 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  {.    pPrior = p
15160 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
15170 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
15180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
15190 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
151a0 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50  Dest);.    p->pP
151b0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
151c0 20 20 20 69 66 28 20 72 63 20 7c 7c 20 70 52 69     if( rc || pRi
151d0 67 68 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69 74 20  ghtmost->pLimit 
151e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e  ) break;.    p->
151f0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f  nSelectRow = nRo
15200 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  w;.    p = p->pN
15210 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
15220 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
15230 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15240 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
15250 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
15260 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
15270 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
15280 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
15290 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
152a0 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
152b0 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
152c0 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
152d0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
152e0 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
152f0 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
15300 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
15310 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
15320 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
15330 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
15340 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
15350 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
15360 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
15370 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
15380 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
15390 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
153a0 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
153b0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
153c0 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
153d0 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
153e0 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
153f0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
15400 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
15410 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
15420 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
15430 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
15440 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
15450 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
15460 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
15470 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
15480 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
15490 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
154a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
154b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
154c0 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
154d0 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
154e0 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
154f0 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
15500 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
15510 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
15520 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
15530 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
15540 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
15550 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
15560 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
15570 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
15580 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
15590 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
155a0 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
155b0 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
155c0 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
155d0 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
155e0 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
155f0 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
15600 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
15610 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
15620 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
15630 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
15640 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
15650 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
15660 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
15670 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
15680 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
15690 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
156a0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
156b0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
156c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
156d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
156e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
156f0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
15700 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
15710 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
15720 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
15730 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
15740 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
15750 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
15760 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
15770 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
15780 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
15790 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
157a0 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
157b0 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
157c0 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
157d0 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15800 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
15810 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
15820 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
15830 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
15840 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
15850 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
15860 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
15870 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
15880 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
15890 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
158a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
158b0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
158c0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
158d0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
158e0 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
158f0 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
15900 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
15910 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
15920 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
15930 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
15940 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
15950 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
15960 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
15970 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
15980 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
15990 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
159a0 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ch */.  assert( 
159b0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
159c0 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
159d0 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  || p->op==TK_ALL
159e0 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   || p->op==TK_UN
159f0 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  ION );.  db = pP
15a00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
15a10 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
15a20 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
15a30 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
15a40 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72 69 6f  OrderBy || pPrio
15a50 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
15a60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15a70 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c 61 75  (pParse,"%s clau
15a80 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
15a90 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
15aa0 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72 69 6f  re",.      pPrio
15ab0 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 3f  r->pOrderBy!=0 ?
15ac0 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22 4c   "ORDER BY" : "L
15ad0 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f 70 4e  IMIT", selectOpN
15ae0 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
15af0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
15b00 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
15b10 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
15b20 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
15b30 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
15b40 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
15b50 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
15b60 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
15b70 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
15b80 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
15b90 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
15ba0 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
15bb0 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
15bc0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
15bd0 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
15be0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
15bf0 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
15c00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15c10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15c20 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
15c30 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
15c40 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
15c50 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
15c60 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
15c70 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20   handling for a 
15c80 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
15c90 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
15ca0 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  as a VALUES clau
15cb0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
15cc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
15cd0 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20  MultiValue ){.  
15ce0 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
15cf0 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c  ctValues(pParse,
15d00 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
15d10 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
15d20 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
15d30 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
15d40 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
15d50 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
15d60 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
15d70 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
15d80 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
15d90 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
15da0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
15db0 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
15dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
15dd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50  EList->nExpr==pP
15de0 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
15df0 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  xpr );..#ifndef 
15e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
15e10 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
15e20 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
15e30 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
15e40 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
15e50 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ry(pParse, p, &d
15e60 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  est);.  }else.#e
15e70 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  ndif..  /* Compo
15e80 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
15e90 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
15ea0 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
15eb0 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
15ec0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
15ed0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
15ee0 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
15ef0 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
15f00 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65   p, pDest);.  }e
15f10 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  lse{..#ifndef SQ
15f20 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
15f30 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  N.    if( p->pNe
15f40 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  xt==0 ){.      E
15f50 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
15f60 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d  (pParse, 1, "COM
15f70 50 4f 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a  POUND QUERY"));.
15f80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
15f90 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
15fa0 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e  ){.      Explain
15fb0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15fc0 65 2c 20 31 2c 20 22 4c 45 46 54 2d 4d 4f 53 54  e, 1, "LEFT-MOST
15fd0 20 53 55 42 51 55 45 52 59 22 29 29 3b 0a 20 20   SUBQUERY"));.  
15fe0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
15ff0 50 6c 61 6e 53 65 74 49 64 28 70 50 61 72 73 65  PlanSetId(pParse
16000 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 7d  , pPrior);.    }
16010 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16020 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
16030 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
16040 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
16050 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
16060 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
16070 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
16080 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  K_ALL: {.       
16090 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
160a0 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69         int nLimi
160b0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
160c0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
160d0 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  it );.        pP
160e0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  rior->iLimit = p
160f0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
16100 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
16110 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
16120 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
16130 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
16140 69 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  it;.        rc =
16150 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
16160 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
16170 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  dest);.        p
16180 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
16190 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
161a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
161b0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
161c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
161d0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
161e0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
161f0 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
16200 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
16210 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
16220 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
16230 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
16240 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  t ){.          a
16250 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
16260 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
16270 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  Not, p->iLimit);
16280 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16290 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
162a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
162b0 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
162c0 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
162d0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f         if( p->iO
162e0 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
162f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16300 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
16310 73 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  setLimit,.      
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
16340 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c  t, p->iOffset+1,
16350 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20   p->iOffset);.  
16360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16370 20 20 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c    }.        Expl
16380 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
16390 61 72 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20  arse, 1, "UNION 
163a0 41 4c 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ALL"));.        
163b0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
163c0 53 65 74 49 64 28 70 50 61 72 73 65 2c 20 70 29  SetId(pParse, p)
163d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
163e0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
163f0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
16400 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16420 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65  );.        pDele
16430 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
16440 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
16450 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
16460 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
16470 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
16480 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
16490 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
164a0 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ectRow);.       
164b0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
164c0 6d 69 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  mit.         && 
164d0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
164e0 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
164f0 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69  mit->pLeft, &nLi
16500 6d 69 74 29 0a 20 20 20 20 20 20 20 20 20 26 26  mit).         &&
16510 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e   nLimit>0 && p->
16520 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c  nSelectRow > sql
16530 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
16540 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20  nLimit) .       
16550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
16560 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
16570 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
16580 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  )nLimit);.      
16590 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
165a0 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
165b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
165c0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
165d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
165f0 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45  .      case TK_E
16600 58 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73  XCEPT:.      cas
16610 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
16620 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
16630 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
16640 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
16650 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  emp table holdin
16660 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
16670 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20      u8 op = 0;  
16680 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
16690 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
166a0 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
166b0 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  elf */.        i
166c0 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
166d0 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
166e0 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
166f0 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
16700 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
16710 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53  *pLimit;    /* S
16720 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
16730 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20  ->nLimit  */.   
16740 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
16750 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
16760 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a  t uniondest;.  .
16770 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16780 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
16790 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  PT );.        te
167a0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
167b0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
167c0 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
167d0 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  _Union;.        
167e0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
167f0 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
16800 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
16810 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
16820 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
16830 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
16840 6f 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  our.          **
16850 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
16860 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
16870 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
16880 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
16890 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
168a0 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
168b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
168c0 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
168d0 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65  Parm;.        }e
168e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
168f0 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
16900 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
16910 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16920 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
16930 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
16940 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
16950 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
16960 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
16970 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16980 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16990 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
169a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
169b0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
169c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
169d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
169e0 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
169f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
16a00 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
16a10 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
16a20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
16a30 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
16a40 20 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67           findRig
16a50 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
16a60 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
16a70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
16a80 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
16a90 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
16aa0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
16ab0 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
16ac0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
16ad0 72 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  r left.        *
16ae0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
16af0 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
16b00 72 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73  rBy );.        s
16b10 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
16b20 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
16b30 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
16b40 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ab);.        rc 
16b50 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
16b60 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
16b70 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
16b80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
16b90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
16ba0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
16bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
16bc0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
16bd0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
16be0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
16bf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
16c00 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
16c10 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  T ){.          o
16c20 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
16c30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16c40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16c50 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
16c60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
16c70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
16c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16c90 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
16ca0 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20         pLimit = 
16cb0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
16cc0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
16cd0 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64  ;.        uniond
16ce0 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
16cf0 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
16d00 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
16d10 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54  , 1, "%s USING T
16d20 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20  EMP B-TREE",.   
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e         selectOpN
16d50 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20  ame(p->op)));.  
16d60 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
16d70 72 79 50 6c 61 6e 53 65 74 49 64 28 70 50 61 72  ryPlanSetId(pPar
16d80 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
16d90 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
16da0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
16db0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
16dc0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
16dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
16de0 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
16df0 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
16e00 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
16e10 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
16e20 64 65 72 42 79 2e 0a 20 20 20 20 20 20 20 20 2a  derBy..        *
16e30 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
16e40 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
16e50 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
16e60 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
16e70 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ak. */.        s
16e80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
16e90 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
16ea0 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70  erBy);.        p
16eb0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
16ec0 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
16ed0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
16ee0 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
16ef0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
16f00 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
16f10 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  NION ){.        
16f20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
16f30 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
16f40 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
16f50 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
16f60 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  tRow);.        }
16f70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16f80 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
16f90 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
16fa0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
16fb0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
16fc0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
16fd0 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
16fe0 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20 20 20   = 0;.  .       
16ff0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
17000 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
17010 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
17020 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
17030 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20         ** it is 
17040 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
17050 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 20 20  y need..        
17060 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
17070 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
17080 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
17090 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
170a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
170b0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
170c0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rOp ){.         
170d0 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
170e0 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
170f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17100 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
17110 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
17120 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17130 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  el(v);.         
17140 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
17150 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17160 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70  ;.          comp
17170 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
17180 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
17190 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
171a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
171b0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
171c0 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
171d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
171e0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53  v);.          iS
171f0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
17200 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17210 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65  ;.          sele
17220 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
17230 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  se, p, unionTab,
17240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17250 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
17260 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
17270 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
17280 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17290 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
172a0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
172b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
172c0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
172d0 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
172e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
172f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17300 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17310 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
17320 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17330 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17340 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
17350 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
17360 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
17380 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d  ault: assert( p-
17390 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43  >op==TK_INTERSEC
173a0 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 69  T ); {.        i
173b0 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
173c0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
173d0 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
173e0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  ;.        Expr *
173f0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
17400 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
17410 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74    SelectDest int
17420 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20  ersectdest;.    
17430 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 0a 20      int r1;.  . 
17440 20 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53         /* INTERS
17450 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
17460 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
17470 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
17480 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 77  es.        ** tw
17490 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
174a0 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
174b0 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
174c0 20 42 65 67 69 6e 0a 20 20 20 20 20 20 20 20 2a   Begin.        *
174d0 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
174e0 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
174f0 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 20  ll need..       
17500 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 61 62 31   */.        tab1
17510 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17520 2b 3b 0a 20 20 20 20 20 20 20 20 74 61 62 32 20  +;.        tab2 
17530 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
17540 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17550 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
17560 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 61   );.  .        a
17570 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
17580 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
17590 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
175a0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  1, 0);.        a
175b0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
175c0 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
175d0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
175e0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
175f0 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69  addr;.        fi
17600 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
17610 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
17620 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
17630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17640 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 0a 20 20  >pEList );.  .  
17650 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
17660 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
17670 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
17680 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
17690 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  "..        */.  
176a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
176b0 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
176c0 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
176d0 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
176e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
176f0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
17700 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
17710 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
17720 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17730 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
17740 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
17750 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
17760 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
17770 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
17780 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
17790 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 20  e "tab2".       
177a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
177b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
177c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
177d0 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
177e0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
177f0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
17800 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
17810 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
17820 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
17830 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
17840 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
17850 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
17860 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
17870 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
17880 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65       intersectde
17890 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62  st.iSDParm = tab
178a0 32 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  2;.        Expla
178b0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
178c0 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e  rse, 1, "%s USIN
178d0 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a  G TEMP B-TREE",.
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
17900 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b  OpName(p->op)));
17910 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
17920 51 75 65 72 79 50 6c 61 6e 53 65 74 49 64 28 70  QueryPlanSetId(p
17930 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
17940 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
17950 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
17960 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
17970 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17980 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
17990 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  K );.        pDe
179a0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
179b0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
179c0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
179d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
179e0 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
179f0 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
17a00 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
17a10 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
17a20 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
17a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
17a40 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
17a50 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
17a60 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
17a70 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a 20  t = pLimit;.  . 
17a80 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
17a90 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
17aa0 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
17ab0 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
17ac0 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
17ad0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
17ae0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
17af0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
17b00 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
17b10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
17b20 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
17b30 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
17b40 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17b50 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
17b60 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
17b70 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
17b80 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
17b90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17ba0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
17bb0 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  b1, iBreak); Vdb
17bc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17bd0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
17be0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17bf0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 53  rse);.        iS
17c00 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
17c10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17c20 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31  owData, tab1, r1
17c30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17c40 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17c50 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
17c60 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
17c70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
17c80 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
17ca0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17cb0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
17cc0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
17cd0 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31  (pParse, p, tab1
17ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17cf0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
17d00 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
17d10 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
17d20 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17d30 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
17d40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17d50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17d60 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
17d70 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
17d80 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17d90 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17da0 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
17db0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
17dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17dd0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
17de0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
17df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17e00 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
17e10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
17e20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
17e30 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66 20   }.  .  #ifndef 
17e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
17e50 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  AIN.    if( p->p
17e60 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Next==0 ){.     
17e70 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
17e80 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  nPop(pParse);.  
17e90 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d    }.  #endif.  }
17ea0 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  .  .  /* Compute
17eb0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
17ec0 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
17ed0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
17ee0 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
17ef0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
17f00 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
17f10 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
17f20 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
17f30 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
17f40 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
17f50 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
17f60 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
17f70 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
17f80 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
17f90 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
17fa0 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
17fb0 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
17fc0 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
17fd0 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
17fe0 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
17ff0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
18000 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
18010 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
18020 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
18030 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
18040 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18050 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
18060 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
18070 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
180a0 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
180b0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
180c0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
180d0 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
180e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
180f0 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
18100 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
18110 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
18120 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
18130 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
18140 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
18150 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
18160 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
18170 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
18180 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
18190 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
181c0 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
181d0 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
181e0 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
181f0 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
18200 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
18210 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
18220 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
18230 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
18240 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
18250 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
18260 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18270 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  T;.      goto mu
18280 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
18290 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
182a0 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
182b0 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
182c0 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
182d0 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
182e0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
182f0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
18300 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
18310 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
18320 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
18330 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
18340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18350 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
18360 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
18370 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
18380 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
18390 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
183a0 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
183b0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
183c0 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
183d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
183e0 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
183f0 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
18400 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
18410 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
18420 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
18430 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
18440 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
18450 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
18460 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
18470 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
18480 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
18490 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
184a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
184b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
184c0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
184d0 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
184e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
184f0 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
18500 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
18510 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
18520 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18540 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
18550 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
18560 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
18570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18580 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
18590 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
185a0 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
185b0 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
185c0 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  t->iSdst = dest.
185d0 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  iSdst;.  pDest->
185e0 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64  nSdst = dest.nSd
185f0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  st;.  sqlite3Sel
18600 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
18610 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
18620 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
18630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
18640 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
18650 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73  ./*.** Error mes
18660 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77  sage for when tw
18670 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  o or more terms 
18680 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
18690 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72  lect have differ
186a0 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75  ent.** size resu
186b0 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lt sets..*/.void
186c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72   sqlite3SelectWr
186d0 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72  ongNumTermsError
186e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
186f0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
18700 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
18710 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20  SF_Values ){.   
18720 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18730 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41  (pParse, "all VA
18740 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74  LUES must have t
18750 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
18760 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c  f terms");.  }el
18770 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
18780 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18790 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
187a0 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
187b0 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
187c0 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
187d0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
187e0 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
187f0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
18800 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
18810 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
18820 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
18830 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
18840 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
18850 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
18860 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
18870 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
18880 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
18890 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
188a0 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
188b0 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
188c0 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
188d0 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
188e0 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
188f0 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
18900 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
18910 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
18920 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
18930 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
18940 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
18950 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
18960 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
18970 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
18980 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
18990 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
189a0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
189b0 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
189c0 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
189d0 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
189e0 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
189f0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
18a00 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
18a10 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
18a20 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
18a30 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
18a40 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
18a50 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
18a60 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
18a70 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
18a80 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
18a90 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
18aa0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
18ab0 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
18ac0 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
18ad0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
18ae0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
18af0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
18b00 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
18b10 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b30 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
18b40 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
18b50 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
18b60 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
18b70 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
18b80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
18b90 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
18ba0 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
18bb0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
18bc0 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
18bd0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
18be0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
18bf0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
18c00 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
18c10 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
18c20 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
18c30 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
18c40 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
18c50 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
18c60 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
18c70 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
18c80 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ca0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
18cb0 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
18cc0 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
18cd0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
18ce0 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
18cf0 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
18d00 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18d10 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
18d20 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
18d30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18d40 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
18d50 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
18d60 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
18d70 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
18d80 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
18d90 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
18da0 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
18db0 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
18dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18dd0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
18de0 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rev); VdbeCovera
18df0 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32  ge(v);.    addr2
18e00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
18e10 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
18e20 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  re, pIn->iSdst, 
18e30 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
18e40 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20  nSdst,.         
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e60 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
18e70 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
18e80 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
18e90 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
18ea0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18eb0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c  P_Jump, addr2+2,
18ec0 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72   iContinue, addr
18ed0 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  2+2); VdbeCovera
18ee0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
18ef0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18f00 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
18f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18f20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d  v, OP_Copy, pIn-
18f30 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
18f40 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29  1, pIn->nSdst-1)
18f50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18f60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18f70 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
18f80 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
18f90 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
18fa0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
18fb0 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
18fc0 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  s the first OFFS
18fd0 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
18fe0 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
18ff0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
19000 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
19010 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
19020 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ue);..  assert( 
19030 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
19040 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73  T_Exists );.  as
19050 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
19060 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st!=SRT_Table );
19070 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
19080 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
19090 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
190a0 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
190b0 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
190c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
190d0 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
190e0 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
190f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19100 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
19110 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
19120 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19130 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19140 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19150 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
19160 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
19170 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  dst, r1);.      
19180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19190 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
191a0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
191b0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
191c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
191d0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
191e0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
191f0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
19200 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
19210 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
19220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19230 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19240 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
19250 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19260 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19270 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
19280 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
19290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
192a0 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
192b0 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
192c0 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
192d0 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
192e0 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
192f0 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
19300 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
19310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
19320 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20  n->nSdst>1 );.  
19330 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
19340 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19350 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19360 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
19370 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
19380 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
19390 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  Sdst, .         
193a0 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66   r1, pDest->zAff
193b0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
193c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
193d0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
193e0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
193f0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
19400 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
19410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19420 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
19430 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
19440 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  arm, r1,.       
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20      pIn->iSdst, 
19470 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
19480 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19490 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
194a0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
194b0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
194c0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
194d0 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
194e0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
194f0 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
19500 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
19510 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
19520 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
19530 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
19540 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
19550 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
19560 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19570 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
19580 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
19590 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
195a0 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74  >nErr>0 );  test
195b0 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
195c0 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=1 );.      sql
195d0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
195e0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
195f0 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
19600 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
19610 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
19620 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
19630 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
19640 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
19650 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
19660 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
19670 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19680 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
19690 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
196a0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
196b0 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
196c0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
196d0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
196e0 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
196f0 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
19700 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
19710 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
19720 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
19730 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
19740 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
19750 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19760 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
19770 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
19780 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
19790 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
197a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
197b0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
197c0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
197d0 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
197e0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
197f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19800 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
19810 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
19820 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
19830 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
19840 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
19850 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
19860 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
19870 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
19880 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
19890 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
198a0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
198b0 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
198c0 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
198d0 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
198e0 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
198f0 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
19900 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
19910 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
19920 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
19930 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
19940 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
19950 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
19960 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
19970 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
19980 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
19990 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
199a0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
199b0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
199c0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
199d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
199e0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
199f0 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
19a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19a10 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
19a20 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
19a30 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
19a40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19a50 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
19a60 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
19a70 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
19a80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19a90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
19aa0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
19ab0 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
19ac0 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
19ad0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
19ae0 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
19af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19b00 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
19b10 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
19b20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
19b30 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
19b40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
19b50 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
19b60 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
19b70 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19b80 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
19b90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19ba0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
19bb0 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
19bc0 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
19bd0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
19be0 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
19bf0 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
19c00 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
19c10 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
19c20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19c30 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
19c40 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
19c50 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
19c60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
19c70 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
19c80 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
19c90 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
19ca0 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
19cb0 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
19cc0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
19cd0 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
19ce0 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
19cf0 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
19d00 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
19d10 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
19d20 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
19d30 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
19d40 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
19d50 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
19d60 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
19d70 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
19d80 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
19d90 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
19da0 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
19db0 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
19dc0 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
19dd0 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
19de0 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
19df0 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
19e00 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
19e10 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
19e20 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
19e30 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
19e40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
19e50 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
19e60 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
19e70 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
19e80 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
19e90 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
19ea0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
19eb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19ec0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
19ed0 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
19ee0 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
19ef0 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
19f00 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
19f10 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
19f20 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
19f30 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
19f40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
19f50 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
19f60 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
19f70 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
19f80 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
19f90 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
19fa0 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
19fb0 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
19fc0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
19fd0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
19fe0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
19ff0 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
1a000 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
1a010 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1a020 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1a030 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
1a040 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
1a050 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
1a060 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
1a070 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
1a080 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
1a090 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
1a0a0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
1a0b0 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
1a0c0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
1a0d0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
1a0e0 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
1a0f0 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
1a100 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
1a110 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
1a120 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1a130 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
1a140 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
1a150 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
1a160 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
1a170 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
1a180 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1a190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
1a1a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
1a1b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1a1c0 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
1a1d0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
1a1e0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
1a1f0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1a200 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
1a210 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
1a220 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
1a230 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
1a240 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
1a250 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
1a260 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
1a270 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
1a280 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
1a290 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
1a2a0 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
1a2b0 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
1a2c0 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1a2d0 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
1a2f0 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
1a300 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1a310 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1a320 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1a330 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
1a340 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
1a350 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
1a360 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
1a370 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
1a380 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
1a390 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
1a3a0 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
1a3b0 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
1a3c0 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
1a3d0 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
1a3e0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
1a3f0 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
1a400 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
1a410 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
1a420 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
1a430 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
1a440 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1a450 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
1a460 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
1a470 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
1a480 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
1a490 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
1a4a0 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
1a4b0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
1a4c0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
1a4d0 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
1a4e0 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
1a4f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
1a500 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
1a510 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
1a520 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
1a530 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
1a540 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
1a550 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
1a560 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
1a570 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1a580 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
1a590 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
1a5a0 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
1a5b0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1a5c0 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
1a5d0 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
1a5e0 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
1a5f0 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
1a600 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
1a610 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
1a620 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1a630 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
1a640 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
1a650 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
1a660 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
1a670 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
1a680 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
1a690 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
1a6a0 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
1a6b0 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
1a6c0 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
1a6d0 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
1a6e0 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
1a6f0 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
1a700 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
1a710 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
1a720 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
1a730 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
1a740 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
1a750 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
1a760 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
1a770 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
1a780 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
1a790 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
1a7a0 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
1a7b0 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
1a7c0 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
1a7d0 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
1a7e0 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
1a7f0 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
1a800 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
1a810 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
1a820 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
1a830 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
1a840 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
1a850 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
1a860 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
1a870 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
1a880 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
1a890 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
1a8a0 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
1a8b0 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
1a8c0 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
1a8d0 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
1a8e0 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
1a8f0 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
1a900 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
1a910 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
1a920 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
1a930 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
1a940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a950 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1a960 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
1a970 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
1a980 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a990 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1a9a0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1a9b0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1a9c0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1a9d0 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
1a9e0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
1a9f0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
1aa00 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
1aa10 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
1aa20 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
1aa30 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1aa40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1aa50 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
1aa60 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
1aa70 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
1aa80 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
1aa90 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
1aaa0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
1aab0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
1aac0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
1aad0 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
1aae0 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
1aaf0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
1ab00 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
1ab10 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1ab20 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
1ab30 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
1ab40 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
1ab50 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
1ab60 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1ab70 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1ab80 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
1ab90 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
1aba0 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
1abb0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1abc0 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
1abd0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1abe0 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
1abf0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1ac00 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
1ac10 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1ac20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
1ac30 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1ac40 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
1ac50 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1ac60 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
1ac70 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1ac80 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
1ac90 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
1aca0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
1acb0 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
1acc0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
1acd0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
1ace0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1acf0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
1ad00 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1ad10 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
1ad20 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
1ad30 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
1ad40 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
1ad50 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
1ad60 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
1ad70 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
1ad80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1ad90 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1ada0 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
1adb0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1adc0 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b  nt addrEofA_noB;
1add0 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
1ade0 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20  e addrEofA if B 
1adf0 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
1ae00 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
1ae10 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
1ae20 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1ae30 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
1ae40 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1ae50 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
1ae60 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1ae70 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
1ae80 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1ae90 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
1aea0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1aeb0 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
1aec0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1aed0 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
1aee0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1aef0 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
1af00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
1af10 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
1af20 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
1af30 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
1af40 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
1af50 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
1af60 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1af70 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
1af80 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
1af90 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
1afa0 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
1afb0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
1afc0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
1afd0 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
1afe0 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
1aff0 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
1b000 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
1b010 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
1b020 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
1b030 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
1b040 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
1b050 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
1b060 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
1b070 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
1b080 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
1b090 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
1b0a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
1b0b0 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
1b0c0 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  mt */.  int addr
1b0d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1b0e0 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
1b0f0 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
1b100 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
1b110 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1b120 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
1b130 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
1b140 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
1b150 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
1b160 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
1b170 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
1b180 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1b190 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
1b1a0 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
1b1b0 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
1b1c0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
1b1d0 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
1b1e0 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
1b1f0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1b200 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1b210 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
1b220 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1b230 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
1b240 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1b250 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
1b260 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b270 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
1b280 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b290 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
1b2a0 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
1b2b0 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
1b2c0 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
1b2d0 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
1b2e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1b2f0 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ->pOrderBy!=0 );
1b300 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44  .  assert( pKeyD
1b310 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e  up==0 ); /* "Man
1b320 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73  aged" code needs
1b330 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23   this.  Ticket #
1b340 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20  3382. */.  db = 
1b350 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
1b360 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1b370 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1b380 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65  );       /* Alre
1b390 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65  ady thrown the e
1b3a0 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c  rror if VDBE all
1b3b0 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c  oc failed */.  l
1b3c0 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
1b3d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1b3e0 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d  );.  labelCmpr =
1b3f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1b400 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a  Label(v);...  /*
1b410 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52   Patch up the OR
1b420 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
1b430 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  */.  op = p->op;
1b440 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d    .  pPrior = p-
1b450 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
1b460 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  t( pPrior->pOrde
1b470 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64  rBy==0 );.  pOrd
1b480 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1b490 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  By;.  assert( pO
1b4a0 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64  rderBy );.  nOrd
1b4b0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
1b4c0 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f  >nExpr;..  /* Fo
1b4d0 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65  r operators othe
1b4e0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
1b4f0 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65   we have to make
1b500 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
1b510 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1b520 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79  use covers every
1b530 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
1b540 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20  ult set.  Add.  
1b550 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  ** terms to the 
1b560 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1b570 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
1b580 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  */.  if( op!=TK_
1b590 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ALL ){.    for(i
1b5a0 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  =1; db->mallocFa
1b5b0 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d  iled==0 && i<=p-
1b5c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
1b5d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1b5e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1b5f0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
1b600 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(j=0, pItem=pO
1b610 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72  rderBy->a; j<nOr
1b620 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65  derBy; j++, pIte
1b630 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
1b640 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1b650 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
1b660 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
1b670 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1b680 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  yCol==i ) break;
1b690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b6a0 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
1b6b0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1b6c0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1b6d0 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
1b6e0 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
1b6f0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
1b700 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1b710 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70  _BKPT;.        p
1b720 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
1b730 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
1b740 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
1b750 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  e = i;.        p
1b760 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1b770 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
1b780 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1b790 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
1b7a0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  pNew);.        i
1b7b0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
1b7c0 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72  rderBy->a[nOrder
1b7d0 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  By++].u.x.iOrder
1b7e0 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a  ByCol = (u16)i;.
1b7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b800 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1b810 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70  the comparison p
1b820 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b  ermutation and k
1b830 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75  eyinfo that is u
1b840 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  sed with.  ** th
1b850 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73  e permutation us
1b860 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
1b870 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a  if the next.  **
1b880 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20   row of results 
1b890 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63  comes from selec
1b8a0 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20  tA or selectB.  
1b8b0 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69  Also add explici
1b8c0 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
1b8d0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
1b8e0 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73  Y clause terms s
1b8f0 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
1b900 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  subqueries.  ** 
1b910 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64  to the right and
1b920 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76   the left are ev
1b930 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73  aluated, they us
1b940 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
1b950 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20  ** collation..  
1b960 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20  */.  aPermute = 
1b970 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1b980 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
1b990 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b  int)*(nOrderBy +
1b9a0 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72   1));.  if( aPer
1b9b0 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
1b9c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1b9d0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65   *pItem;.    aPe
1b9e0 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65  rmute[0] = nOrde
1b9f0 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  rBy;.    for(i=1
1ba00 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
1ba10 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79  ->a; i<=nOrderBy
1ba20 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1ba30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ba40 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1ba50 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
1ba60 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1ba70 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c  u.x.iOrderByCol<
1ba80 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
1ba90 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
1baa0 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
1bab0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
1bac0 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
1bad0 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69  KeyMerge = multi
1bae0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
1baf0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
1bb00 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1bb10 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a   pKeyMerge = 0;.
1bb20 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61    }..  /* Reatta
1bb30 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
1bb40 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75  clause to the qu
1bb50 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ery..  */.  p->p
1bb60 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1bb70 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f  By;.  pPrior->pO
1bb80 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
1bb90 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
1bba0 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
1bbb0 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  , 0);..  /* Allo
1bbc0 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
1bbd0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1bbe0 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
1bbf0 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
1bc00 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
1bc10 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
1bc20 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
1bc30 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
1bc40 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
1bc50 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
1bc60 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
1bc70 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
1bc80 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1bc90 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
1bca0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1bcb0 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
1bcc0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
1bcd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
1bce0 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20  derBy>=nExpr || 
1bcf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1bd00 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20   );.    regPrev 
1bd10 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1bd20 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
1bd30 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20  em += nExpr+1;. 
1bd40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1bd60 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
1bd70 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
1bd80 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
1bd90 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29  oc(db, nExpr, 1)
1bda0 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
1bdb0 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
1bdc0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
1bdd0 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
1bde0 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66  yDup) );.      f
1bdf0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
1be00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
1be10 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
1be20 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
1be30 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
1be40 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
1be50 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
1be60 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
1be70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
1be80 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
1be90 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
1bea0 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
1beb0 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
1bec0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1bed0 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1bee0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73   0;.  sqlite3Res
1bef0 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
1bf00 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
1bf10 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
1bf20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
1bf30 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
1bf40 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1bf50 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1bf60 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72  rse, pPrior, pPr
1bf70 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  ior->pOrderBy, "
1bf80 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20  ORDER");.  }..  
1bf90 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
1bfa0 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a  imit registers *
1bfb0 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
1bfc0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
1bfd0 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , p, labelEnd);.
1bfe0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
1bff0 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  && op==TK_ALL ){
1c000 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
1c010 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c020 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d  .    regLimitB =
1c030 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c050 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
1c060 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20  y, p->iOffset ? 
1c070 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  p->iOffset+1 : p
1c080 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  ->iLimit,.      
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c              regL
1c0b0 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  imitA);.    sqli
1c0c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c0d0 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d   OP_Copy, regLim
1c0e0 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b  itA, regLimitB);
1c0f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1c100 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d  gLimitA = regLim
1c110 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  itB = 0;.  }.  s
1c120 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1c130 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
1c140 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  .  p->pLimit = 0
1c150 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20  ;..  regAddrA = 
1c160 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c170 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70    regAddrB = ++p
1c180 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1c190 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73  egOutA = ++pPars
1c1a0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
1c1b0 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
1c1c0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
1c1d0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
1c1e0 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stA, SRT_Corouti
1c1f0 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
1c200 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1c210 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53  stInit(&destB, S
1c220 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
1c230 67 41 64 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c  gAddrB);..  Expl
1c240 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
1c250 61 72 73 65 2c 20 31 2c 20 22 4d 45 52 47 45 20  arse, 1, "MERGE 
1c260 28 25 73 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e  (%s)", selectOpN
1c270 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20  ame(p->op)));.. 
1c280 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
1c290 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
1c2a0 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
1c2b0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
1c2c0 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
1c2d0 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
1c2e0 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
1c2f0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  lect..  */.  add
1c300 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
1c310 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1c320 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
1c330 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
1c340 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1c350 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1c360 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drA, 0, addrSele
1c370 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctA);.  VdbeComm
1c380 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45  ent((v, "left SE
1c390 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
1c3a0 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
1c3b0 69 6d 69 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e  imitA;.  Explain
1c3c0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
1c3d0 65 2c 20 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a  e, 1, "LEFT"));.
1c3e0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
1c3f0 61 6e 53 65 74 49 64 28 70 50 61 72 73 65 2c 20  anSetId(pParse, 
1c400 70 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74  pPrior);.  sqlit
1c410 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1c420 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
1c430 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1c440 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1c450 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1c460 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1c470 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a  v, addr1);..  /*
1c480 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1c490 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1c4a0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1c4b0 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
1c4c0 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
1c4d0 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
1c4e0 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
1c4f0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1c500 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1c510 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1c520 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1c530 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1c540 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64  regAddrB, 0, add
1c550 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62  rSelectB);.  Vdb
1c560 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69  eComment((v, "ri
1c570 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
1c580 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
1c590 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
1c5a0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
1c5b0 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
1c5c0 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
1c5d0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
1c5e0 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79   .  ExplainQuery
1c5f0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
1c600 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20 45 78   "RIGHT"));.  Ex
1c610 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 53 65  plainQueryPlanSe
1c620 74 49 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  tId(pParse, p);.
1c630 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1c640 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
1c650 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
1c660 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
1c670 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
1c680 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
1c690 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1c6a0 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29  ine(v, regAddrB)
1c6b0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1c6c0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1c6d0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1c6e0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1c6f0 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
1c700 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1c710 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1c720 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1c730 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1c740 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1c750 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
1c760 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
1c770 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1c780 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1c790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c7a0 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
1c7b0 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1c7d0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1c7e0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
1c7f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1c800 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1c810 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1c820 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
1c830 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1c840 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1c850 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1c860 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1c870 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1c880 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1c890 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
1c8a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1c8b0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1c8c0 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
1c8d0 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
1c8e0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1c8f0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1c900 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
1c910 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
1c920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c930 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1c940 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1c950 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
1c960 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
1c970 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
1c980 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1c990 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1c9a0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1c9b0 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
1c9c0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1c9d0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1c9e0 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
1c9f0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
1ca00 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
1ca10 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1ca20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61  addrEofA_noB = a
1ca30 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45  ddrEofA = labelE
1ca40 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  nd;.  }else{  . 
1ca50 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1ca60 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
1ca70 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1ca80 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
1ca90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1caa0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1cab0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1cac0 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1cad0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1cae0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1caf0 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c   regAddrB, label
1cb00 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
1cb30 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1cb40 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1cb50 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  v, addrEofA);.  
1cb60 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1cb70 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1cb80 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
1cb90 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
1cba0 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tRow);.  }..  /*
1cbb0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1cbc0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1cbd0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1cbe0 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1cbf0 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1cc00 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1cc10 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1cc20 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1cc30 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1cc40 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1cc50 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1cc60 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1cc70 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1cc80 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1cc90 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1cca0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1ccb0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1ccc0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1ccd0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1cce0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1ccf0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1cd00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1cd10 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1cd20 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1cd30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cd40 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1cd50 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1cd60 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1cd70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1cd80 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29  oto(v, addrEofB)
1cd90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1cda0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1cdb0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1cdc0 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1cdd0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1cde0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1cdf0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1ce00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ce10 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1ce20 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1ce30 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1ce40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ce50 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1ce60 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1ce70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1ce80 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1ce90 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1cea0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1ceb0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1cec0 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1ced0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1cee0 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1cef0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1cf00 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1cf10 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1cf20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1cf30 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1cf40 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1cf50 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1cf60 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1cf70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1cf80 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1cf90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cfa0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1cfb0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1cfc0 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1cfd0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1cfe0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1cff0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
1d000 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1d010 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1d020 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
1d030 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1d040 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
1d050 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1d060 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
1d070 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1d080 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
1d090 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1d0a0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
1d0b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d0c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1d0d0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1d0e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1d0f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d100 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1d110 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1d120 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1d130 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1d140 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1d150 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1d160 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1d170 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1d180 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1d190 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1d1a0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
1d1b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d1c0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1d1d0 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29  A, addrEofA_noB)
1d1e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1d1f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d200 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1d210 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1d220 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1d230 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1d240 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
1d250 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
1d260 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1d270 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1d280 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
1d290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d2a0 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
1d2b0 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
1d2c0 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
1d2d0 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
1d2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d2f0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
1d300 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
1d310 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
1d320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d330 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1d340 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
1d350 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
1d360 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1d370 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
1d380 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
1d390 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
1d3a0 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
1d3b0 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
1d3c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1d3d0 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  v);..  /* Jump t
1d3e0 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
1d3f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
1d400 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
1d410 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1d420 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1d430 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
1d440 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
1d450 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1d460 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
1d470 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
1d480 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
1d490 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1d4a0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
1d4b0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
1d4c0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1d4d0 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
1d4e0 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
1d4f0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72   = pPrior;.  pPr
1d500 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
1d510 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
1d520 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
1d530 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
1d540 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
1d550 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
1d560 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45  ueries ****/.  E
1d570 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
1d580 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  op(pParse);.  re
1d590 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1d5a0 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1d5b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1d5c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d5d0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1d5e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1d5f0 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
1d600 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e   of the SubstCon
1d610 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63  text object desc
1d620 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74  ribes an substit
1d630 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f  ution edit.** to
1d640 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
1d650 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a   a parse tree..*
1d660 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e  *.** All referen
1d670 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
1d680 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61  n table iTable a
1d690 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  re to be replace
1d6a0 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  d by correspondi
1d6b0 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
1d6c0 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a  s in pEList..*/.
1d6d0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1d6e0 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20  ubstContext {.  
1d6f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1d700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d710 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1d720 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1d730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d740 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72  /* Replace refer
1d750 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
1d760 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
1d770 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  wTable;         
1d780 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20     /* New table 
1d790 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1d7a0 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20  isLeftJoin;     
1d7b0 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f        /* Add TK_
1d7c0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f  IF_NULL_ROW opco
1d7d0 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c  des on each repl
1d7e0 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  acement */.  Exp
1d7f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1d800 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1d810 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  ement expression
1d820 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74  s */.} SubstCont
1d830 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ext;../* Forward
1d840 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1d850 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1d860 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74  stExprList(Subst
1d870 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69  Context*, ExprLi
1d880 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1d890 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75  d substSelect(Su
1d8a0 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c  bstContext*, Sel
1d8b0 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ect*, int);../*.
1d8c0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1d8d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1d8e0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1d8f0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1d900 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1d910 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1d920 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1d930 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1d940 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1d950 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1d960 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1d970 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1d980 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1d990 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1d9a0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1d9b0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1d9c0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1d9d0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1d9e0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1d9f0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1da00 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1da10 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1da20 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1da30 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1da40 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1da50 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1da60 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1da70 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1da80 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1da90 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
1daa0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
1dab0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
1dac0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
1dad0 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
1dae0 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
1daf0 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
1db00 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1db10 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
1db20 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
1db30 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43  stExpr(.  SubstC
1db40 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1db50 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1db60 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1db70 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1db80 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1db90 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1dba0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1dbb0 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  curs */.){.  if(
1dbc0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1dbd0 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1dbe0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1dbf0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
1dc00 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69     && pExpr->iRi
1dc10 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53  ghtJoinTable==pS
1dc20 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29  ubst->iTable.  )
1dc30 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69  {.    pExpr->iRi
1dc40 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1dc50 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1dc60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1dc70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1dc80 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1dc90 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1dca0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1dcb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1dcc0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1dcd0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1dce0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1dcf0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  r *pNew;.      E
1dd00 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75  xpr *pCopy = pSu
1dd10 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70  bst->pEList->a[p
1dd20 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1dd30 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1dd40 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20   ifNullRow;.    
1dd50 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74    assert( pSubst
1dd60 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ->pEList!=0 && p
1dd70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53  Expr->iColumn<pS
1dd80 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ubst->pEList->nE
1dd90 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1dda0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1ddb0 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1ddc0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1ddd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1dde0 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29  rIsVector(pCopy)
1ddf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1de00 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
1de10 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  g(pSubst->pParse
1de20 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , pCopy);.      
1de30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1de40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75  qlite3 *db = pSu
1de50 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  bst->pParse->db;
1de60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1de70 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1de80 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b  && pCopy->op!=TK
1de90 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1dea0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e       memset(&ifN
1deb0 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f  ullRow, 0, sizeo
1dec0 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20  f(ifNullRow));. 
1ded0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1dee0 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55  ow.op = TK_IF_NU
1def0 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  LL_ROW;.        
1df00 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66    ifNullRow.pLef
1df10 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20  t = pCopy;.     
1df20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69       ifNullRow.i
1df30 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e  Table = pSubst->
1df40 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20  iNewTable;.     
1df50 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66       pCopy = &if
1df60 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20  NullRow;.       
1df70 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20   }.        pNew 
1df80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1df90 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a  (db, pCopy, 0);.
1dfa0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1dfb0 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65   && pSubst->isLe
1dfc0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1dfd0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1dfe0 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e  rty(pNew, EP_Can
1dff0 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
1e000 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1e010 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72  New && ExprHasPr
1e020 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
1e030 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1e040 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69         pNew->iRi
1e050 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1e060 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1e070 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1e080 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1e090 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f  (pNew, EP_FromJo
1e0a0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
1e0b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e0c0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1e0d0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1e0e0 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1e0f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1e100 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1e110 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
1e120 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ROW && pExpr->iT
1e130 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1e140 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45  able ){.      pE
1e150 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53  xpr->iTable = pS
1e160 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1e170 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72  .    }.    pExpr
1e180 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1e190 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1e1a0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  r->pLeft);.    p
1e1b0 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1e1c0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1e1d0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1e1e0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1e1f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e200 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1e210 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1e220 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  ct(pSubst, pExpr
1e230 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b  ->x.pSelect, 1);
1e240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e250 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1e260 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1e270 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
1e280 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1e290 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1e2a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1e2b0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1e2c0 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1e2d0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1e2e0 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1e2f0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1e300 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
1e310 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1e320 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1e330 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  itutes */.){.  i
1e340 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1e350 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1e360 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1e370 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1e380 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1e390 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1e3a0 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d  r(pSubst, pList-
1e3b0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1e3c0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1e3d0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53  substSelect(.  S
1e3e0 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1e3f0 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1e400 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1e410 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  itution */.  Sel
1e420 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1e430 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1e440 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1e450 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1e460 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64  tions */.  int d
1e470 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1e480 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1e490 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1e4a0 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1e4b0 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1e4c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e4d0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1e4e0 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1e4f0 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1e500 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1e510 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  bst, p->pEList);
1e520 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1e530 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47  st(pSubst, p->pG
1e540 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62  roupBy);.    sub
1e550 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1e560 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  t, p->pOrderBy);
1e570 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
1e580 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1e590 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  st, p->pHaving);
1e5a0 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1e5b0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1e5c0 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  t, p->pWhere);. 
1e5d0 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1e5e0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1e5f0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1e600 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1e610 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1e620 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1e630 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1e640 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74  lect(pSubst, pIt
1e650 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b  em->pSelect, 1);
1e660 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1e670 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1e680 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1e690 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1e6a0 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1e6b0 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1e6c0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50   }.  }while( doP
1e6d0 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e  rior && (p = p->
1e6e0 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a  pPrior)!=0 );.}.
1e6f0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1e700 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1e710 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1e720 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e730 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
1e740 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e750 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1e760 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1e770 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
1e780 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1e790 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1e7a0 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
1e7b0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1e7c0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
1e7d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1e7e0 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
1e7f0 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
1e800 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
1e810 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
1e820 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
1e830 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
1e840 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
1e850 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
1e860 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
1e870 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
1e880 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
1e890 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1e8a0 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
1e8b0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
1e8c0 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
1e8d0 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
1e8e0 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
1e8f0 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
1e900 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
1e910 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1e920 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1e930 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
1e940 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
1e950 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
1e960 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
1e970 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
1e980 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
1e990 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
1e9a0 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
1e9b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
1e9c0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
1e9d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1e9e0 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
1e9f0 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
1ea00 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
1ea10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ea20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
1ea30 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
1ea40 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
1ea50 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
1ea60 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
1ea70 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1ea80 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
1ea90 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1eaa0 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
1eab0 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1eac0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
1ead0 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69  implification gi
1eae0 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
1eaf0 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
1eb00 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
1eb10 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
1eb20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
1eb30 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
1eb40 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
1eb50 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
1eb60 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
1eb70 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
1eb80 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
1eb90 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  ng is subject to
1eba0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1ebb0 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a  onstraints:.**.*
1ebc0 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1ebd0 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1ebe0 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1ebf0 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1ec00 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1ec10 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1ec20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1ec30 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67  annot both be ag
1ec40 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1ec50 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1ec60 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1ec70 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1ec80 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1ec90 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20  :.**        (2) 
1eca0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ecb0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1ecc0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1ecd0 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1ece0 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
1ecf0 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20  a join and.**   
1ed00 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75       (2b) the ou
1ed10 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1ed20 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1ed30 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1ed40 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1ed50 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  one FROM-clause 
1ed60 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1ed70 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1ed90 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68  flattening.  (Th
1eda0 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63  is is due to tic
1edb0 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1edc0 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20  9abf80].**      
1edd0 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35         from 2015
1ede0 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1edf0 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62   (3)  If the sub
1ee00 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1ee10 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1ee20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a  LEFT JOIN then.*
1ee30 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68  *        (3a) th
1ee40 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1ee50 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1ee60 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20  .**        (3b) 
1ee70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ee80 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1ee90 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  may not contain 
1eea0 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20  a virtual.**    
1eeb0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61           table a
1eec0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63  nd.**        (3c
1eed0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1eee0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20  y may not be an 
1eef0 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1ef00 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1ef10 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20  uery can not be 
1ef20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1ef30 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1ef40 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1ef50 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1ef60 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1ef70 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1ef80 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1ef90 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1efa0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1efb0 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1efc0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1efd0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1efe0 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1eff0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1f000 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1f010 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1f020 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1f030 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1f040 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1f050 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20  ies.  Was:.**   
1f060 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71       If the subq
1f070 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1f080 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  e, the outer que
1f090 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49  ry may not be DI
1f0a0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1f0b0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1f0c0 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  y must have a FR
1f0d0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1f0e0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1f0f0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1f100 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1f110 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1f120 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  ng a FROM clause
1f130 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1f140 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1f150 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1f160 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1f170 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1f180 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1f190 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1f1a0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20  **.**   (8)  If 
1f1b0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1f1c0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1f1d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1f1e0 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a   not be a join..
1f1f0 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20  **.**   (9)  If 
1f200 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1f210 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1f220 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1f230 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
1f240 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  e..**.**  (**)  
1f250 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1f260 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1f270 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1f280 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1f290 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1f2a0 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1f2b0 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1f2c0 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1f2d0 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
1f2e0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1f2f0 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75  t: "If the subqu
1f300 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1f310 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1f320 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
1f330 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
1f340 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
1f350 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1f360 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1f370 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
1f380 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
1f390 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
1f3a0 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
1f3b0 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
1f3c0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1f3d0 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
1f3e0 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
1f3f0 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
1f400 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
1f410 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
1f420 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
1f430 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
1f440 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1f450 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1f460 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1f470 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
1f480 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
1f490 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66  .**.**  (15)  If
1f4a0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f4b0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f   is part of a co
1f4c0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1f4d0 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
1f4e0 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e    subquery may n
1f4f0 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  ot use LIMIT..**
1f500 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1f510 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1f520 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1f530 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1f540 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
1f550 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1f560 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
1f570 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20  ery may not.**  
1f580 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20        use ORDER 
1f590 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1f5a0 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1f5b0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1f5c0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1f5d0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1f5e0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1f5f0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1f600 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75   (17)  If the su
1f610 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  bquery is a comp
1f620 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1f630 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61  n.**        (17a
1f640 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f  ) all compound o
1f650 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
1f660 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e   a UNION ALL, an
1f670 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62  d.**        (17b
1f680 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69  ) no terms withi
1f690 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
1f6a0 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61  ompound may be a
1f6b0 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20  ggregate.**     
1f6c0 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54           or DIST
1f6d0 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  INCT, and.**    
1f6e0 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20      (17c) every 
1f6f0 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
1f700 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e  subquery compoun
1f710 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  d must have a FR
1f720 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  OM clause.**    
1f730 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75      (17d) the ou
1f740 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1f750 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
1f760 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72       (17d1) aggr
1f770 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20  egate, or.**    
1f780 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29            (17d2)
1f790 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a   DISTINCT, or.**
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
1f7b0 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  7d3) a join..**.
1f7c0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1f7d0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1f7e0 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1f7f0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1f800 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1f810 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1f820 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1f830 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1f840 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1f850 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1f860 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1f870 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1f880 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1f890 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1f8a0 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1f8b0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1f8c0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1f8d0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1f8e0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1f8f0 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1f900 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1f910 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1f920 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1f930 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1f940 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1f950 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1f960 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1f970 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1f980 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1f990 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1f9a0 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1f9b0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1f9c0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1f9d0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1f9e0 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1f9f0 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1fa00 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1fa10 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1fa20 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1fa30 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1fa40 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1fa50 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1fa60 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1fa70 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1fa80 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1fa90 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1faa0 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1fab0 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1fac0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1fad0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1fae0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1faf0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1fb00 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74  R BY clause of t
1fb10 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1fb20 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1fb30 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1fb40 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1fb50 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1fb60 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20  *  (19)  If the 
1fb70 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fb80 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fb90 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fba0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
1fbb0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
1fbc0 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
1fbd0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1fbe0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1fbf0 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
1fc00 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1fc10 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
1fc20 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
1fc30 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
1fc40 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
1fc50 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
1fc60 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
1fc70 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
1fc80 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1fc90 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
1fca0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
1fcb0 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
1fcc0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
1fcd0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1fce0 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
1fcf0 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
1fd00 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
1fd10 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
1fd20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
1fd30 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73    (21)  If the s
1fd40 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
1fd50 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
1fd60 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1fd70 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  be.**        DIS
1fd80 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1fd90 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1fda0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1fdb0 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
1fdc0 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73   not be a recurs
1fdd0 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
1fde0 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69  (**)  Subsumed i
1fdf0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1fe00 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66  (17d3).  Was: If
1fe10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fe20 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20   is.**        a 
1fe30 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74  recursive CTE, t
1fe40 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72  hen the sub-quer
1fe50 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  y may not be a c
1fe60 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
1fe70 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65  *        This re
1fe80 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1fe90 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1fea0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1feb0 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1fec0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1fed0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1fee0 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1fef0 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1ff00 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1ff10 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1ff20 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1ff30 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1ff40 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1ff50 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
1ff60 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1ff70 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1ff80 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  be an aggregate 
1ff90 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
1ffa0 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
1ffb0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
1ffc0 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
1ffd0 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
1ffe0 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
1fff0 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
20000 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
20010 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
20020 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
20030 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
20040 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
20050 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
20060 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
20070 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
20080 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
20090 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
200a0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
200b0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
200c0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
200d0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
200e0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
200f0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
20100 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
20110 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20120 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20130 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20140 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20150 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20160 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20170 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20180 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20190 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
201a0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
201b0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
201c0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
201d0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
201e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
201f0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
20200 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
20210 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20220 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20230 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20240 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20250 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20260 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20270 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20280 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
20290 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
202a0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
202b0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
202c0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
202d0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
202e0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
202f0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
20300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20310 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
20320 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
20330 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
20340 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
20350 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
20360 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
20370 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
20380 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
20390 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
203a0 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
203b0 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
203c0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
203d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
203e0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
203f0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
20400 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
20410 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
20420 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
20430 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
20440 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
20450 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
20460 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
20470 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
20480 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
20490 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
204a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
204b0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
204c0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
204d0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
204e0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
204f0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
20500 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
20510 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
20520 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
20530 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
20540 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
20550 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
20560 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
20570 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
20580 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
20590 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
205c0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
205f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
20600 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20610 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
20620 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
20630 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20640 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
20650 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
20660 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
20670 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
20680 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
20690 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
206a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
206b0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
206c0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
206d0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
206e0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
206f0 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
20700 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
20710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
20720 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
20730 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
20740 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
20750 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
20760 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
20770 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
20780 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
20790 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
207a0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
207b0 3b 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  ;..  pSubSrc = p
207c0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
207d0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
207e0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
207f0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
20800 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
20810 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
20820 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
20830 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
20840 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
20850 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
20860 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
20870 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
20880 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
20890 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
208a0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
208b0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
208c0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
208d0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
208e0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
208f0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
20900 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
20910 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
20920 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
20930 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
20940 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
20950 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
20960 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
20970 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
20980 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
20990 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52  pSub->pLimit->pR
209a0 69 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b  ight ) return 0;
209b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
209c0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
209d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
209e0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
209f0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
20a00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
20a40 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
20a50 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
20a60 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
20a70 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a90 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
20aa0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
20ab0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
20ac0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
20ad0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
20ae0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34  * Restriction (4
20af0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
20b00 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
20b10 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
20b20 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
20b30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
20b40 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
20b50 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
20b60 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
20b70 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
20b80 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
20b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20bc0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
20bd0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
20be0 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
20bf0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20c20 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
20c30 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
20c40 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
20c50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20c60 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20c70 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
20c80 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
20c90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
20ca0 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
20cb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
20cc0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
20cd0 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
20ce0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
20cf0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
20d00 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65  rsive) ){.    re
20d10 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
20d20 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a  ictions (22) */.
20d30 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
20d40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20d50 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
20d60 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
20d70 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  IN, then the.  *
20d80 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  * subquery may n
20d90 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73  ot be a join its
20da0 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c  elf (3a). Exampl
20db0 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  e of why this is
20dc0 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65   not.  ** allowe
20dd0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
20de0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
20df0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
20e00 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
20e10 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
20e20 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
20e30 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
20e40 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
20e50 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
20e60 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
20e70 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
20e80 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
20e90 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ing..  **.  ** I
20ea0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20eb0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
20ec0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
20ed0 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74  IN, then the out
20ee0 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61  er.  ** query ca
20ef0 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65  nnot be an aggre
20f00 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73  gate. (3c)  This
20f10 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
20f20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
20f30 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70  aggregates are p
20f40 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
20f50 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
20f60 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
20f70 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a  .  ** the LEFT J
20f80 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  OIN table should
20f90 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
20fa0 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
20fb0 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
20fc0 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
20fd0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
20fe0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
20ff0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
21000 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
21010 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
21020 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
21030 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69  || isAgg || IsVi
21040 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61  rtual(pSubSrc->a
21050 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
21060 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20     /*  (3a)     
21070 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20          (3c)    
21080 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72   (3b) */.      r
21090 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
210a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
210b0 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57  _EXTRA_IFNULLROW
210c0 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f  .  else if( iFro
210d0 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b  m>0 && !isAgg ){
210e0 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20  .    /* Setting 
210f0 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31  isLeftJoin to -1
21100 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c   causes OP_IfNul
21110 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20  lRow opcodes to 
21120 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  be generated for
21130 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65  .    ** every re
21140 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72  ference to any r
21150 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f  esult column fro
21160 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20  m subquery in a 
21170 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a  join, even.    *
21180 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72  * though they ar
21190 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  e not necessary.
211a0 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65    This will stre
211b0 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49  ss-test the OP_I
211c0 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a  fNullRow .    **
211d0 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
211e0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b  isLeftJoin = -1;
211f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
21200 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21210 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  7): If the sub-q
21220 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
21230 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
21240 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
21250 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
21260 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
21270 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
21280 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
21290 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
212a0 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
212b0 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
212c0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
212d0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
212e0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
212f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21300 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
21310 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
21320 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
21330 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
21340 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20  tion (20) */.   
21350 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
21360 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
21370 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
21380 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
21390 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
213a0 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29  urn 0; /* (17d1)
213b0 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37  , (17d2), or (17
213c0 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  d3) */.    }.   
213d0 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
213e0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
213f0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
21400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
21410 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
21420 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
21430 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
21440 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
21450 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
21460 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
21470 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
21480 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
21490 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
214a0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
214b0 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
214c0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
214d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
214e0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
214f0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28  xpr );.      if(
21500 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
21510 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
21520 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
21530 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a  =0    /* (17b) *
21540 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  /.       || (pSu
21550 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
21560 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20   /* (17a) */.   
21590 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
215a0 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20  rc->nSrc<1      
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
215d0 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b  17c) */.      ){
215e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
215f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
21600 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
21610 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
21620 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21630 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29  Restriction (18)
21640 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
21650 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21660 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
21670 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
21680 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
21690 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
216a0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
216b0 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
216c0 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
216d0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
216e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78    }.  }..  /* Ex
216f0 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33  -restriction (23
21700 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79  ):.  ** The only
21710 20 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65   way that the re
21720 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
21730 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69  a CTE can contai
21740 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a  n a compound.  *
21750 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f  * subquery is fo
21760 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  r the subquery t
21770 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66  o be one term of
21780 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
21790 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
217a0 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68  ry is a join, th
217b0 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  en the flattenin
217c0 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
217d0 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20  en stopped by.  
217e0 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  ** restriction (
217f0 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73  17d3).  */.  ass
21800 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
21810 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
21820 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50  )==0 || pSub->pP
21830 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  rior==0 );..  /*
21840 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
21850 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
21860 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
21870 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
21880 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
21890 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
218a0 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
218b0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
218c0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
218d0 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
218e0 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
218f0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
21900 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
21910 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
21920 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
21930 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
21940 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
21950 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
21960 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
21970 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
21980 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
21990 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
219a0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
219b0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
219c0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
219d0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
219e0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
219f0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
21a00 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
21a10 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
21a20 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
21a30 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
21a40 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
21a50 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
21a60 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
21a70 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
21a80 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
21a90 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
21aa0 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
21ab0 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
21ac0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
21ad0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
21ae0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
21af0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
21b00 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
21b10 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
21b20 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
21b30 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
21b40 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
21b50 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
21b60 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
21b70 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
21b80 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
21b90 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
21ba0 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
21bb0 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
21bc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
21bd0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
21be0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
21bf0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
21c00 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
21c10 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
21c20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
21c30 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
21c40 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
21c50 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
21c60 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
21c70 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
21c80 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
21c90 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
21ca0 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
21cb0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
21cc0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
21cd0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
21ce0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
21cf0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
21d00 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
21d10 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
21d20 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
21d30 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
21d40 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
21d50 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
21d60 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
21d70 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
21d80 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
21d90 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
21da0 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
21db0 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
21dc0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
21dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
21de0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
21df0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
21e00 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
21e10 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
21e20 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
21e30 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
21e40 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
21e50 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
21e60 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
21e70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
21e80 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
21e90 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65  ->pLimit;.    Se
21ea0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
21eb0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
21ec0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
21ed0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
21ee0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
21ef0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
21f00 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
21f10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
21f20 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
21f30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
21f40 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62  tName(pNew, pSub
21f50 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
21f60 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
21f70 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
21f80 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
21f90 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
21fa0 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
21fb0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
21fc0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
21fd0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
21fe0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
21ff0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
22000 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
22010 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
22020 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
22030 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
22040 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
22050 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
22060 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
22070 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
22080 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  ,p,("compound-su
22090 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72  bquery flattener
220a0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 22 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20  " creates %s.%p 
220d0 61 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77 2d  as peer\n",pNew-
220e0 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29  >zSelName, pNew)
220f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22100 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22110 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
22120 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
22130 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
22140 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
22150 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
22160 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
22170 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
22180 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
22190 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
221a0 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
221b0 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
221c0 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
221d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
221e0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
221f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
22200 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22210 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
22220 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22230 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
22240 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22250 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22260 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
22270 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
22280 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22290 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
222a0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
222b0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
222c0 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
222d0 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
222e0 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
222f0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
22300 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
22310 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
22320 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
22330 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
22340 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
22350 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
22360 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
22370 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
22380 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
22390 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
223a0 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
223b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
223c0 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
223d0 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
223e0 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
223f0 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
22400 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
22410 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
22420 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
22430 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
22440 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
22450 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
22460 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
22470 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
22480 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
22490 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
224a0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
224b0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
224c0 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
224d0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
224e0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
224f0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
22500 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
22510 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
22520 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
22530 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
22540 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
22550 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
22560 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
22570 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
22580 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
22590 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
225a0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
225b0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
225c0 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
225d0 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
225e0 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
225f0 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
22600 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
22610 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
22620 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
22630 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
22640 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
22650 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
22660 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
22670 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
22680 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
22690 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
226a0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
226b0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
226c0 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
226d0 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
226e0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
226f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
22700 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
22710 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
22720 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
22730 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
22740 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
22750 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
22760 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
22770 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
22780 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
22790 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
227a0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
227b0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
227c0 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
227d0 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
227e0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
227f0 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
22800 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
22810 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
22820 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
22830 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
22840 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
22850 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
22860 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
22870 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
22880 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
22890 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
228a0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
228b0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
228c0 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
228d0 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
228e0 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
228f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
22900 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
22910 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
22920 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
22930 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
22940 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
22950 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
22960 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
22970 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22980 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
22990 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
229a0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
229b0 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
229c0 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
229d0 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
229e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
229f0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
22a00 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
22a10 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
22a20 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
22a30 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
22a40 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
22a50 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
22a60 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
22a70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
22a80 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
22a90 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
22aa0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
22ab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22ac0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
22ad0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
22ae0 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
22af0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
22b00 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
22b10 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
22b20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
22b30 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
22b40 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
22b50 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
22b60 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
22b70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22b80 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
22b90 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
22ba0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
22bb0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
22bc0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
22bd0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
22be0 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
22bf0 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
22c00 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
22c10 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
22c20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
22c30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
22c40 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
22c50 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
22c60 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
22c70 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
22c80 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
22c90 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
22ca0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
22cb0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
22cc0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
22cd0 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
22ce0 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  er query FROM cl
22cf0 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e  ause to 4 slots.
22d00 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64  .    ** The midd
22d10 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  le slot is expan
22d20 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
22d30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
22d40 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66  e space.    ** f
22d50 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65  or the two eleme
22d60 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
22d70 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
22d80 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
22d90 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
22da0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
22db0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
22dc0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
22dd0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
22de0 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
22df0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
22e00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22e10 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
22e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22e30 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
22e40 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
22e50 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
22e60 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
22e70 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
22e80 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
22e90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
22ea0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
22eb0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
22ec0 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
22ed0 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
22ee0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22ef0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
22f00 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
22f10 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
22f20 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
22f30 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
22f40 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20     iNewParent = 
22f50 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  pSubSrc->a[i].iC
22f60 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d  ursor;.      mem
22f70 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
22f80 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
22f90 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
22fa0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
22fb0 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
22fc0 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
22fd0 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
22fe0 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
22ff0 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
23000 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
23010 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
23020 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
23030 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
23040 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
23050 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
23060 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
23070 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
23080 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
23090 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
230a0 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
230b0 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
230c0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
230d0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
230e0 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
230f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
23100 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
23110 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
23120 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
23130 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
23140 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23150 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
23160 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
23170 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
23180 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23190 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
231a0 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
231b0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
231c0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
231d0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
231e0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
231f0 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
23200 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
23210 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
23220 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
23230 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
23240 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
23250 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
23260 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
23270 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
23280 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
23290 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
232a0 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
232b0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
232c0 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
232d0 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
232e0 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
232f0 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
23300 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
23310 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
23320 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
23330 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
23340 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
23350 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
23360 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
23370 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
23380 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
23390 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
233a0 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
233b0 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
233c0 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
233d0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
233e0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
233f0 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
23400 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
23410 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
23420 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
23430 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
23440 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
23450 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
23460 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
23470 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
23480 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
23490 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
234a0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
234b0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
234c0 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
234d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
234e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
234f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
23500 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
23510 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
23520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23530 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
23540 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
23550 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
23560 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
23570 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
23580 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
23590 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d    }.    pWhere =
235a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
235b0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
235c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73  , 0);.    if( is
235d0 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20  LeftJoin>0 ){.  
235e0 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
235f0 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65  pWhere, iNewPare
23600 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
23610 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
23620 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
23630 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72  db, pWhere, pPar
23640 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  ent->pWhere);.  
23650 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
23660 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
23670 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
23680 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  x;.      x.pPars
23690 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
236a0 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61    x.iTable = iPa
236b0 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rent;.      x.iN
236c0 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61  ewTable = iNewPa
236d0 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73  rent;.      x.is
236e0 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66  LeftJoin = isLef
236f0 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70  tJoin;.      x.p
23700 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45  EList = pSub->pE
23710 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73  List;.      subs
23720 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72  tSelect(&x, pPar
23730 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ent, 0);.    }. 
23740 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61   .    /* The fla
23750 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
23760 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
23770 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
23780 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
23790 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
237a0 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ct. .    */.    
237b0 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
237c0 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
237d0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
237e0 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
237f0 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
23800 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
23810 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
23820 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
23830 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
23840 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
23850 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
23860 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
23870 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
23880 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
23890 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
238a0 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
238b0 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
238c0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
238d0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
238e0 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
238f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
23900 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
23910 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
23920 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
23930 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
23940 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
23950 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
23960 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
23970 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
23980 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
23990 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  b1);..#if SELECT
239a0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
239b0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
239c0 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
239d0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
239e0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
239f0 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e  ,("After flatten
23a00 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ing:\n"));.    s
23a10 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
23a20 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
23a30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
23a40 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
23a50 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
23a60 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
23a70 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
23a80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
23a90 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  */....#if !defin
23aa0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
23ab0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
23ac0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
23ad0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _VIEW)./*.** Mak
23ae0 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65  e copies of rele
23af0 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  vant WHERE claus
23b00 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f  e terms of the o
23b10 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a  uter query into.
23b20 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
23b30 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e  use of subquery.
23b40 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
23b50 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23b60 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
23b70 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
23b80 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e  t1) WHERE x=5 AN
23b90 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72  D y=10;.**.** Tr
23ba0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
23bb0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
23bc0 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
23bd0 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
23be0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
23bf0 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a  5 AND c-d=10).**
23c00 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41       WHERE x=5 A
23c10 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
23c20 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20  he hope is that 
23c30 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20  the terms added 
23c40 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  to the inner que
23c50 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20  ry will make it 
23c60 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e  more.** efficien
23c70 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  t..**.** Do not 
23c80 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74  attempt this opt
23c90 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a  imization if:.**
23ca0 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20 54 68  .**   (1) (** Th
23cb0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 77  is restriction w
23cc0 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30  as removed on 20
23cd0 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20 75 73  17-09-29.  We us
23ce0 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
23cf0 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68 69 73     disallow this
23d00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
23d10 72 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  r aggregate subq
23d20 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a  ueries, but now.
23d30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 74 20  **           it 
23d40 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20 70 75  is allowed by pu
23d50 74 74 69 6e 67 20 74 68 65 20 65 78 74 72 61 20  tting the extra 
23d60 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48 41 56  terms on the HAV
23d70 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  ING clause..**  
23d80 20 20 20 20 20 20 20 20 20 54 68 65 20 61 64 64           The add
23d90 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  ed HAVING clause
23da0 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 69 66   is pointless if
23db0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6c 61   the subquery la
23dc0 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  cks.**          
23dd0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
23de0 73 65 2e 20 20 42 75 74 20 73 75 63 68 20 61 20  se.  But such a 
23df0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
23e00 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a   also harmless.*
23e10 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  *           so t
23e20 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20 61 70  here does not ap
23e30 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79 20 72  pear to be any r
23e40 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65 78 74  eason to add ext
23e50 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20  ra logic.**     
23e60 20 20 20 20 20 20 74 6f 20 73 75 70 70 72 65 73        to suppres
23e70 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20  s it. **).**.** 
23e80 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20    (2) The inner 
23e90 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63  query is the rec
23ea0 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
23eb0 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
23ec0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
23ed0 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20    (3) The inner 
23ee0 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49  query has a LIMI
23ef0 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20  T clause (since 
23f00 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
23f10 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20  he WHERE.**     
23f20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68    close would ch
23f30 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67  ange the meaning
23f40 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a   of the LIMIT)..
23f50 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20  **.**   (4) The 
23f60 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
23f70 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
23f80 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
23f90 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  and the.**      
23fa0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
23fb0 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 64 6f  e pushed down do
23fc0 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72 6f 6d  es not come from
23fd0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 0a 2a   the ON clause.*
23fe0 2a 20 20 20 20 20 20 20 6f 6e 20 74 68 61 74 20  *       on that 
23ff0 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
24000 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45     (5) The WHERE
24010 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
24020 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e  on originates in
24030 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
24040 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
24050 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
24060 77 68 65 72 65 20 69 43 75 72 73 6f 72 20 69 73  where iCursor is
24070 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 68   not the right-h
24080 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 74 68 61  and table of tha
24090 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66 74 20  t.**       left 
240a0 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d 70 6c  join.  An exampl
240b0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
240c0 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a 20 20     SELECT *.**  
240d0 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 28 53           FROM (S
240e0 45 4c 45 43 54 20 31 20 41 53 20 61 31 20 55 4e  ELECT 1 AS a1 UN
240f0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32  ION ALL SELECT 2
24100 29 20 41 53 20 61 61 0a 2a 2a 20 20 20 20 20 20  ) AS aa.**      
24110 20 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c 45 43       JOIN (SELEC
24120 54 20 31 20 41 53 20 62 32 20 55 4e 49 4f 4e 20  T 1 AS b2 UNION 
24130 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53  ALL SELECT 2) AS
24140 20 62 62 20 4f 4e 20 28 61 31 3d 62 32 29 0a 2a   bb ON (a1=b2).*
24150 2a 20 20 20 20 20 20 20 20 20 20 20 4c 45 46 54  *           LEFT
24160 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 38 20   JOIN (SELECT 8 
24170 41 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c 4c 20  AS c3 UNION ALL 
24180 53 45 4c 45 43 54 20 39 29 20 41 53 20 63 63 20  SELECT 9) AS cc 
24190 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a  ON (b2=2);.**.**
241a0 20 20 20 20 20 20 20 54 68 65 20 63 6f 72 72 65         The corre
241b0 63 74 20 61 6e 73 77 65 72 20 69 73 20 74 68 72  ct answer is thr
241c0 65 65 20 72 6f 77 73 3a 20 20 28 31 2c 31 2c 4e  ee rows:  (1,1,N
241d0 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28 32 2c  ULL),(2,2,8),(2,
241e0 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20 20 42  2,9)..**       B
241f0 75 74 20 69 66 20 74 68 65 20 28 62 32 3d 32 29  ut if the (b2=2)
24200 20 74 65 72 6d 20 77 65 72 65 20 74 6f 20 62 65   term were to be
24210 20 70 75 73 68 65 64 20 64 6f 77 6e 20 69 6e 74   pushed down int
24220 6f 20 74 68 65 20 62 62 20 73 75 62 71 75 65 72  o the bb subquer
24230 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e  y,.**       then
24240 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c 29 20   the (1,1,NULL) 
24250 72 6f 77 20 77 6f 75 6c 64 20 62 65 20 73 75 70  row would be sup
24260 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  pressed..**.** R
24270 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68  eturn 0 if no ch
24280 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61  anges are made a
24290 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f  nd non-zero if o
242a0 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
242b0 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
242c0 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20   are duplicated 
242d0 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  into the subquer
242e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
242f0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
24300 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
24310 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
24320 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66  Parse context (f
24330 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  or malloc() and 
24340 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29  error reporting)
24350 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
24360 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ubq,        /* T
24370 68 65 20 73 75 62 71 75 65 72 79 20 77 68 6f 73  he subquery whos
24380 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
24390 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65  s to be augmente
243a0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
243b0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
243c0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
243d0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
243e0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ery */.  int iCu
243f0 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rsor,          /
24400 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
24410 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
24420 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
24430 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a 20 54 72  oin        /* Tr
24440 75 65 20 69 66 20 70 53 75 62 71 20 69 73 20 74  ue if pSubq is t
24450 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
24460 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
24470 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
24480 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
24490 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d  ;.  if( pWhere==
244a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
244b0 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
244c0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
244d0 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ve ) return 0;  
244e0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
244f0 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  2) */..#ifdef SQ
24500 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
24510 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 74  Only the first t
24520 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
24530 64 20 63 61 6e 20 68 61 76 65 20 61 20 57 49 54  d can have a WIT
24540 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d  H clause.  But m
24550 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f  ake.  ** sure no
24560 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61 72 65   other terms are
24570 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72   marked SF_Recur
24580 73 69 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d  sive in case som
24590 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20  ething changes. 
245a0 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72   ** in the futur
245b0 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  e..  */.  {.    
245c0 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20  Select *pX;  .  
245d0 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20    for(pX=pSubq; 
245e0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  pX; pX=pX->pPrio
245f0 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r){.      assert
24600 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20  ( (pX->selFlags 
24610 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29  & (SF_Recursive)
24620 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  )==0 );.    }.  
24630 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
24640 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
24650 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
24660 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
24670 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
24680 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
24690 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
246a0 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
246b0 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
246c0 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  e, pSubq, pWhere
246d0 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20  ->pRight,.      
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246f0 20 20 20 20 20 20 20 20 20 20 69 43 75 72 73 6f            iCurso
24700 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a  r, isLeftJoin);.
24710 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
24720 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a  ere->pLeft;.  }.
24730 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
24740 0a 20 20 20 26 26 20 28 45 78 70 72 48 61 73 50  .   && (ExprHasP
24750 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45  roperty(pWhere,E
24760 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20  P_FromJoin)==0. 
24770 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68 65 72          || pWher
24780 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
24790 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20 20 29  le!=iCursor).  )
247a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
247b0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
247c0 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  4) */.  }.  if( 
247d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
247e0 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
247f0 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d 3e 69  in) && pWhere->i
24800 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
24810 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  iCursor ){.    r
24820 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
24830 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20  riction (5) */. 
24840 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
24850 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
24860 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
24870 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
24880 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
24890 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53  pSubq ){.      S
248a0 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20  ubstContext x;. 
248b0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
248c0 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
248d0 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30  e->db, pWhere, 0
248e0 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
248f0 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d 31 29  inExpr(pNew, -1)
24900 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65  ;.      x.pParse
24910 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
24920 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72   x.iTable = iCur
24930 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65  sor;.      x.iNe
24940 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72  wTable = iCursor
24950 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74  ;.      x.isLeft
24960 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Join = 0;.      
24970 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71  x.pEList = pSubq
24980 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
24990 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72  pNew = substExpr
249a0 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (&x, pNew);.    
249b0 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c    if( pSubq->sel
249c0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
249d0 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  gate ){.        
249e0 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d  pSubq->pHaving =
249f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
24a00 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
24a10 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77  q->pHaving, pNew
24a20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
24a30 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70          pSubq->p
24a40 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
24a50 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
24a60 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
24a70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
24a80 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70  .      pSubq = p
24a90 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  Subq->pPrior;.  
24aa0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24ab0 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66   nChng;.}.#endif
24ac0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
24ad0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
24ae0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
24af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
24b00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70   */../*.** The p
24b10 46 75 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79  Func is the only
24b20 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
24b30 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79  ion in the query
24b40 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a  .  Check to see.
24b50 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ** if the query 
24b60 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
24b70 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
24b80 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a  ptimization. .**
24b90 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
24ba0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
24bb0 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20  for the min/max 
24bc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68  optimization, th
24bd0 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e  en set.** *ppMin
24be0 4d 61 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44  Max to be an ORD
24bf0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
24c00 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
24c10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
24c20 61 6e 64 20 72 65 74 75 72 6e 20 65 69 74 68 65  and return eithe
24c30 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
24c40 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
24c50 45 52 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69  ERBY_MAX dependi
24c60 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72  ng on.** whether
24c70 20 70 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28   pFunc is a min(
24c80 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
24c90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
24ca0 65 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  e query is not a
24cb0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
24cc0 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
24cd0 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a  ization, return.
24ce0 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
24cf0 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d  _NORMAL (which m
24d00 75 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a  ust be zero)..**
24d10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24d20 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
24d30 61 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20  after aggregate 
24d40 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62  functions have b
24d50 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62  een.** located b
24d60 75 74 20 62 65 66 6f 72 65 20 74 68 65 69 72 20  ut before their 
24d70 61 72 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62  arguments have b
24d80 65 65 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f  een subjected to
24d90 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e   aggregate.** an
24da0 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  alysis..*/.stati
24db0 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
24dc0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
24dd0 70 72 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c  pr *pFunc, ExprL
24de0 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
24df0 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
24e00 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
24e10 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  AL;      /* Retu
24e20 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78  rn value */.  Ex
24e30 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
24e40 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b   pFunc->x.pList;
24e50 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
24e60 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
24e70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24e80 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20   *zFunc;        
24e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24ea0 61 6d 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  ame of aggregate
24eb0 20 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20   function pFunc 
24ec0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
24ed0 4f 72 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f  OrderBy;.  u8 so
24ee0 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65  rtOrder;..  asse
24ef0 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
24f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
24f10 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  unc->op==TK_AGG_
24f20 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66  FUNCTION );.  if
24f30 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  ( pEList==0 || p
24f40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
24f50 29 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20  ) return eRet;. 
24f60 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e   zFunc = pFunc->
24f70 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  u.zToken;.  if( 
24f80 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
24f90 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20  Func, "min")==0 
24fa0 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48  ){.    eRet = WH
24fb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
24fc0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d  .    sortOrder =
24fd0 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a   SQLITE_SO_ASC;.
24fe0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
24ff0 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
25000 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
25010 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
25020 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20  ORDERBY_MAX;.   
25030 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c   sortOrder = SQL
25040 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d  ITE_SO_DESC;.  }
25050 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
25060 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70   eRet;.  }.  *pp
25070 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42  MinMax = pOrderB
25080 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
25090 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
250a0 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t, 0);.  assert(
250b0 20 70 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20   pOrderBy!=0 || 
250c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
250d0 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   );.  if( pOrder
250e0 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
250f0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
25100 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74  sortOrder;.  ret
25110 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
25120 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
25130 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
25140 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
25150 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
25160 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
25170 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
25180 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
25190 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
251a0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
251b0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
251c0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
251d0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
251e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
251f0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
25200 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
25210 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
25220 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
25230 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
25240 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
25250 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
25260 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
25270 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
25280 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
25290 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
252a0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
252b0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
252c0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
252d0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
252e0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
252f0 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
25300 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
25310 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
25320 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
25330 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
25340 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
25350 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
25360 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
25370 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
25380 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
25390 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
253a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
253b0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
253c0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
253d0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
253e0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
253f0 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
25400 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
25410 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
25420 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
25430 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
25440 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
25450 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
25460 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
25470 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
25480 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
25490 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
254a0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
254b0 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
254c0 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
254d0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
254e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
254f0 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
25500 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
25510 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
25520 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
25530 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
25540 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
25550 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
25560 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
25570 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
25580 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
25590 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
255a0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
255b0 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
255c0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
255d0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
255e0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
255f0 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
25600 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
25610 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
25620 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
25630 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
25640 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
25650 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
25660 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
25670 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
25680 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
25690 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
256a0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
256b0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
256c0 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
256d0 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
256e0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
256f0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
25700 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
25710 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
25720 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
25730 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
25740 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
25750 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
25760 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
25770 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
25780 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
25790 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
257a0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
257b0 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
257c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
257d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
257e0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
257f0 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
25800 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
25810 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
25820 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
25830 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25840 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
25850 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
25860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
25870 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
25880 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
25890 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
258a0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
258b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
258c0 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
258d0 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
258e0 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
258f0 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
25900 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
25910 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
25920 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
25930 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
25940 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
25950 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
25960 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
25970 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
25980 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
25990 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
259a0 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
259b0 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
259c0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
259d0 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
259e0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
259f0 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
25a00 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
25a10 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
25a20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
25a30 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
25a40 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
25a50 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
25a60 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
25a70 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
25a80 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
25a90 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
25aa0 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
25ab0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
25ac0 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
25ad0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
25ae0 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
25af0 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
25b00 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
25b10 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
25b20 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
25b30 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
25b40 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
25b50 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
25b60 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
25b70 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
25b80 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
25b90 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
25ba0 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
25bb0 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
25bc0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
25bd0 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
25be0 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
25bf0 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
25c00 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
25c10 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
25c20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
25c30 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
25c40 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
25c50 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
25c60 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
25c70 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
25c80 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
25c90 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
25ca0 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
25cb0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
25cc0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25cd0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
25ce0 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
25cf0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
25d00 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
25d10 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
25d20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
25d30 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
25d40 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
25d50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
25d60 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
25d70 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
25d80 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
25d90 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
25da0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
25db0 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
25dc0 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
25dd0 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
25de0 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
25df0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
25e00 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
25e10 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
25e20 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
25e30 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
25e40 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
25e50 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
25e60 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
25e70 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
25e80 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
25e90 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
25ea0 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
25eb0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
25ec0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25ed0 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
25ee0 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
25ef0 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
25f00 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
25f10 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
25f20 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
25f30 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
25f40 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
25f50 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25f60 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
25f70 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
25f80 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
25f90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
25fa0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
25fb0 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
25fc0 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
25fd0 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
25fe0 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
25ff0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
26000 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
26010 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
26020 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
26030 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
26040 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
26050 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
26060 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
26070 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
26080 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
26090 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
260a0 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
260b0 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
260c0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
260d0 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
260e0 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
260f0 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
26100 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
26110 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
26120 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
26130 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
26140 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
26150 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20  see if the FROM 
26160 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f  clause term pFro
26170 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75  m has table-valu
26180 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  ed function.** a
26190 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74  rguments.  If it
261a0 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20   does, leave an 
261b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
261c0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
261d0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
261e0 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e  since pFrom is n
261f0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
26200 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20   a table-valued 
26210 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
26220 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65  tic int cannotBe
26230 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
26240 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
26250 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
26260 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
26270 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
26280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
26290 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
262a0 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
262b0 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a  ction", pFrom->z
262c0 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
262d0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
262e0 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
262f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
26300 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
26310 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
26320 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
26330 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
26340 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
26350 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
26360 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
26370 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
26380 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
26390 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
263a0 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
263b0 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
263c0 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
263d0 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
263e0 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
263f0 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
26400 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
26410 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
26420 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
26430 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
26440 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
26450 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
26460 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
26470 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
26480 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
26490 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
264a0 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
264b0 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
264c0 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
264d0 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
264f0 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d  * Current innerm
26500 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
26510 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
26520 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
26530 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
26540 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
26550 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
26560 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
26570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26580 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
26590 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
265a0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
265b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
265c0 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
265d0 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
265e0 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
265f0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
26600 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
26610 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
26620 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
26630 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
26640 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
26650 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
26660 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
26670 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
26680 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
26690 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
266a0 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
266b0 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
266c0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
266d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
266e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
266f0 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
26700 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
26710 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
26720 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
26730 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
26740 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
26750 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
26760 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
26770 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26780 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
26790 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
267a0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
267b0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
267c0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
267d0 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
267e0 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
267f0 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
26800 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
26810 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
26820 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
26830 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
26840 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
26850 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
26860 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
26870 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
26880 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
26890 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
268a0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
268b0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
268c0 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
268d0 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
268e0 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
268f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26900 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
26910 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
26920 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
26930 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
26940 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70  =0 || (pParse->p
26950 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73  With==0 && pPars
26960 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d  e->pWithToFree==
26970 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  0) );.  if( pWit
26980 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
26990 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d   pParse->pWith!=
269a0 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69  pWith );.    pWi
269b0 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
269c0 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
269d0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
269e0 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
269f0 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70  Free ) pParse->p
26a00 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69  WithToFree = pWi
26a10 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  th;.  }.}../*.**
26a20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
26a30 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e  hecks if argumen
26a40 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74  t pFrom refers t
26a50 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64  o a CTE declared
26a60 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63   by .** a WITH c
26a70 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61  lause on the sta
26a80 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69  ck currently mai
26a90 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70  ntained by the p
26aa0 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69  arser. And,.** i
26ab0 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
26ac0 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70  essing a CTE exp
26ad0 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69  ression, if it i
26ae0 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  s a recursive.**
26af0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
26b00 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a  e current CTE..*
26b10 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61  *.** If pFrom fa
26b20 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20  lls into either 
26b30 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67  of the two categ
26b40 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72  ories above, pFr
26b50 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20  om->pTab.** and 
26b60 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
26b70 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
26b80 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c  dingly. The call
26b90 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a  er should check.
26ba0 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21  ** (pFrom->pTab!
26bb0 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  =0) to determine
26bc0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
26bd0 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74  a successful mat
26be0 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e  ch.** was found.
26bf0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
26c00 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73  r not a match is
26c10 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f   found, SQLITE_O
26c20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
26c30 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   no error.** occ
26c40 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
26c50 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
26c60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
26c70 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
26c80 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d  * parser and som
26c90 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
26ca0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
26cb0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
26cc0 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78  tatic int withEx
26cd0 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a  pand(.  Walker *
26ce0 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75  pWalker, .  stru
26cf0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
26d00 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73  *pFrom.){.  Pars
26d10 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
26d20 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
26d30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
26d40 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63  rse->db;.  struc
26d50 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20  t Cte *pCte;    
26d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26d70 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55  tched CTE (or NU
26d80 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20  LL if no match) 
26d90 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
26da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26db0 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61       /* WITH cla
26dc0 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65  use that pCte be
26dd0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
26de0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
26df0 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65  ab==0 );..  pCte
26e00 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50   = searchWith(pP
26e10 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72  arse->pWith, pFr
26e20 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69  om, &pWith);.  i
26e30 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54  f( pCte ){.    T
26e40 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
26e50 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
26e60 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
26e70 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  el;.    Select *
26e80 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
26e90 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
26ea0 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
26eb0 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ent */.    int b
26ec0 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20  MayRecursive;   
26ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26ee0 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69   if compound joi
26ef0 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c  ned by UNION [AL
26f00 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a  L] */.    With *
26f10 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20  pSavedWith;     
26f20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
26f30 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  al value of pPar
26f40 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20  se->pWith */..  
26f50 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43    /* If pCte->zC
26f60 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  teErr is non-NUL
26f70 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
26f80 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
26f90 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
26fa0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
26fb0 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
26fc0 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
26fd0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
26fe0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
26ff0 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  y. If pCte->zCte
27000 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
27010 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
27020 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
27030 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
27040 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
27050 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
27060 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a  Cte->zCteErr ){.
27070 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
27080 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
27090 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74  te->zCteErr, pCt
270a0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
270b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
270c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
270d0 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  if( cannotBeFunc
270e0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72  tion(pParse, pFr
270f0 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  om) ) return SQL
27100 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  ITE_ERROR;..    
27110 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
27120 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
27130 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
27140 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
27150 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
27160 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
27170 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
27180 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
27190 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
271a0 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
271b0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
271c0 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
271d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
271e0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
271f0 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
27200 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
27210 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
27220 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
27230 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
27240 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
27250 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73  meral | TF_NoVis
27260 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70  ibleRowid;.    p
27270 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
27280 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
27290 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
272a0 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
272b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
272c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
272d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
272e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
272f0 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
27300 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
27310 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
27320 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
27330 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
27340 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
27350 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
27360 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
27370 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
27380 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
27390 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
273a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
273b0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
273c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
273d0 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
273e0 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
273f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27400 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27410 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
27420 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
27430 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
27440 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
27450 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
27460 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
27470 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
27480 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
27490 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
274a0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
274b0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
274c0 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
274d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
274e0 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
274f0 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
27500 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
27510 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
27520 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
27530 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
27540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
27550 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
27560 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
27570 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
27580 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
27590 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a  b->nTabRef>2 ){.
275a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
275b0 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
275c0 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70   pParse, "multip
275d0 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
275e0 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
275f0 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
27600 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
27610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27620 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
27630 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
27640 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20  TabRef==1 || .  
27650 20 20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c            ((pSel
27660 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65  ->selFlags&SF_Re
27670 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62  cursive) && pTab
27680 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b  ->nTabRef==2 ));
27690 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  ..    pCte->zCte
276a0 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
276b0 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
276c0 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
276d0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
276e0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
276f0 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
27700 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
27710 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
27720 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d   *pPrior = pSel-
27730 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61  >pPrior;.      a
27740 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
27750 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  With==0 );.     
27760 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
27770 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20   pSel->pWith;.  
27780 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
27790 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
277a0 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50  Prior);.      pP
277b0 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b  rior->pWith = 0;
277c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
277d0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
277e0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
277f0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
27800 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
27810 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  ith;..    for(pL
27820 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
27830 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
27840 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
27850 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
27860 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
27870 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
27880 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
27890 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
278a0 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
278b0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
278c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
278d0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
278e0 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
278f0 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
27900 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
27910 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
27920 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
27930 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
27940 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
27950 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
27960 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
27970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27980 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
27990 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
279a0 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
279b0 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
279c0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
279d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
279e0 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
279f0 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
27a00 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
27a10 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
27a20 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67  f( pSel->selFlag
27a30 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
27a40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65   ){.        pCte
27a50 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c  ->zCteErr = "mul
27a60 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20  tiple recursive 
27a70 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b  references: %s";
27a80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27a90 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
27aa0 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
27ab0 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
27ac0 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
27ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
27ae0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
27af0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
27b00 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
27b10 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
27b20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
27b30 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a  pSavedWith;.  }.
27b40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27b50 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
27b60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27b70 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20  IT_CTE./*.** If 
27b80 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65  the SELECT passe
27b90 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
27ba0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20  argument has an 
27bb0 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20  associated WITH 
27bc0 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20  .** clause, pop 
27bd0 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  it from the stac
27be0 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  k stored as part
27bf0 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62   of the Parse ob
27c00 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
27c10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
27c20 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74  d as the xSelect
27c30 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c  Callback2() call
27c40 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74  back by.** sqlit
27c50 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
27c60 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20   when walking a 
27c70 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72  SELECT tree to r
27c80 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20  esolve table.** 
27c90 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20  names and other 
27ca0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
27cb0 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ents. .*/.static
27cc0 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57   void selectPopW
27cd0 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ith(Walker *pWal
27ce0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
27cf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27d00 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
27d10 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
27d20 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
27d30 73 65 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d  se->pWith) && p-
27d40 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
27d50 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
27d60 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
27d70 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  ->pWith;.    if(
27d80 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
27d90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
27da0 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20  e->pWith==pWith 
27db0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
27dc0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
27dd0 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pOuter;.    }.  
27de0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
27df0 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
27e00 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27e10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27e20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
27e30 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
27e40 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
27e50 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
27e60 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
27e70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
27e80 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
27e90 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
27ea0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
27eb0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
27ec0 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
27ed0 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
27ee0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
27ef0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
27f00 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
27f10 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
27f20 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
27f30 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
27f40 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
27f50 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
27f60 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
27f70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
27f80 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
27f90 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
27fa0 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
27fb0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
27fc0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
27fd0 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
27fe0 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
27ff0 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
28000 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
28010 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
28020 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
28030 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
28040 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
28050 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
28060 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
28070 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
28080 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
28090 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
280a0 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
280b0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
280c0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
280d0 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
280e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
280f0 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
28100 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
28110 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
28120 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
28130 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
28140 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
28150 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
28160 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
28170 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
28180 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
28190 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
281a0 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
281b0 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
281c0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
281d0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
281e0 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
281f0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
28200 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
28210 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
28220 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
28230 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
28240 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
28250 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
28260 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
28270 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
28280 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
28290 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
282a0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
282b0 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
282c0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
282d0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
282e0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
282f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
28300 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
28310 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
28320 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
28330 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
28340 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
28350 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
28360 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61  ;.  u32 elistFla
28370 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65  gs = 0;..  p->se
28380 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
28390 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
283a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
283b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
283c0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73  _Abort;.  }.  as
283d0 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
283e0 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c   );.  if( (selFl
283f0 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
28400 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
28410 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
28420 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
28430 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
28440 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
28450 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
28460 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74  (pParse, p->pWit
28470 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  h, 0);..  /* Mak
28480 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
28490 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
284a0 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
284b0 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
284c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
284d0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
284e0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
284f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
28500 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
28510 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
28520 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
28530 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
28540 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28550 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
28560 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
28570 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
28580 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
28590 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
285a0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
285b0 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
285c0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
285d0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
285e0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
285f0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
28600 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
28610 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
28620 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
28630 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
28640 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
28650 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66  assert( pFrom->f
28660 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  g.isRecursive==0
28670 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21   || pFrom->pTab!
28680 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  =0 );.    if( pF
28690 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
286a0 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
286b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
286c0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69  m->pTab==0 );.#i
286d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
286e0 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
286f0 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
28700 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
28710 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28720 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
28730 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
28740 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
28750 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
28760 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28770 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
28780 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
28790 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
287a0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
287b0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
287c0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
287d0 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
287e0 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
287f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
28800 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
28810 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28820 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
28830 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
28840 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
28850 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
28860 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
28870 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
28880 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
28890 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
288a0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
288b0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
288c0 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
288d0 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
288e0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
288f0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
28900 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
28910 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  (db, pFrom->zAli
28920 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  as);.      }else
28930 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
28940 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
28950 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75 62 71  Printf(db, "subq
28960 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a  uery_%p", (void*
28970 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  )pTab);.      }.
28980 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
28990 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
289a0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
289b0 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ; }.      sqlite
289c0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
289d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
289e0 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d  l->pEList,&pTab-
289f0 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f  >nCol,&pTab->aCo
28a00 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
28a10 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
28a20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
28a30 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
28a40 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
28a50 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
28a60 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
28a70 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
28a80 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
28a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
28aa0 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
28ab0 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
28ac0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
28ad0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
28ae0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
28af0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
28b00 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
28b10 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
28b20 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
28b30 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
28b40 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
28b50 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
28b60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
28b70 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66  ->nTabRef>=0xfff
28b80 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
28b90 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28ba0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
28bb0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
28bc0 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
28bd0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
28be0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
28bf0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
28c00 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
28c10 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28c20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
28c30 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
28c40 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
28c50 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
28c60 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
28c70 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
28c80 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
28c90 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
28ca0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
28cb0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
28cc0 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
28cd0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
28ce0 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
28cf0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
28d00 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
28d10 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
28d20 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
28d30 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
28d40 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
28d50 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
28d60 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28d70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
28d80 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
28d90 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
28da0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
28db0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
28dc0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
28dd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28de0 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
28df0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
28e00 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
28e10 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
28e20 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
28e30 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
28e40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28e50 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
28e60 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
28e70 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ect);.        pT
28e80 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ab->nCol = nCol;
28e90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
28ea0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
28eb0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
28ec0 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
28ed0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
28ee0 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
28ef0 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
28f00 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
28f10 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
28f20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
28f30 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
28f40 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
28f50 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
28f60 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
28f70 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
28f80 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
28f90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
28fa0 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
28fb0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
28fc0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
28fd0 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
28fe0 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
28ff0 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
29000 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
29010 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
29020 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
29030 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
29040 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
29050 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
29060 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
29070 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
29080 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
29090 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
290a0 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
290b0 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
290c0 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61  K_ASTERISK opera
290d0 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
290e0 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
290f0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a  n the column.  *
29100 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c  * list.  The fol
29110 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
29120 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
29130 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  he TK_ASTERISK. 
29140 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
29150 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20  and expand each 
29160 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
29170 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
29180 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65  n.  ** all table
29190 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
291a0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
291b0 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
291c0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
291d0 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
291e0 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
291f0 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
29200 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
29210 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
29220 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
29230 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
29240 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
29250 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
29260 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
29270 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
29280 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
29290 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
292a0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
292b0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
292c0 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
292d0 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
292e0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
292f0 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
29300 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
29310 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74  break;.    elist
29320 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
29330 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  gs;.  }.  if( k<
29340 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
29350 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
29360 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
29370 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
29380 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
29390 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
293a0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
293b0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
293c0 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
293d0 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
293e0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
293f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
29400 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
29410 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
29420 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
29430 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
29440 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
29450 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
29460 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
29470 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
29480 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
29490 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
294a0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
294b0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
294e0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
294f0 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
29500 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
29510 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
29520 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
29530 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74  xpr;.      elist
29540 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
29550 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  gs;.      pRight
29560 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
29570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
29580 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
29590 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
295a0 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
295b0 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20  _ASTERISK.      
295c0 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
295d0 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
295e0 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a  p!=TK_ASTERISK).
295f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29600 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
29610 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
29620 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
29630 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
29640 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29650 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
29660 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
29670 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
29680 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
29690 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
296a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
296b0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
296c0 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
296d0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
296e0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
296f0 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
29700 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
29710 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
29720 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
29730 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
29740 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
29750 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
29760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29770 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
29780 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
29790 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
297a0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
297b0 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
297c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
297d0 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
297e0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
297f0 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
29800 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
29810 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
29820 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
29830 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
29840 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
29850 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
29860 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29870 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
29880 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
29890 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
298a0 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
298b0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
298c0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
298d0 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
298e0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
298f0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
29900 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
29910 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
29920 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
29930 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
29940 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
29950 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
29960 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
29970 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
29980 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
29990 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
299a0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
299b0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
299c0 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
299d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
299e0 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
299f0 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
29a00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29a10 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
29a20 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
29a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29a40 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
29a50 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
29a60 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
29a70 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
29a80 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
29a90 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
29aa0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
29ab0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
29ac0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
29ad0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
29ae0 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
29af0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29b00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
29b10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29b20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
29b30 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
29b40 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
29b50 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
29b60 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
29b70 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
29b80 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  [iDb].zDbSName :
29b90 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
29ba0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
29bb0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
29bc0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
29bd0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
29be0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
29bf0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
29c00 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
29c10 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
29c20 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
29c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
29c40 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
29c50 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
29c60 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
29c70 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
29c80 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
29c90 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
29ca0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
29cb0 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
29cc0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
29cd0 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
29ce0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
29cf0 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
29d00 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
29d10 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
29d20 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
29d30 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
29d40 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
29d50 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
29d60 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
29d70 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
29d80 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
29d90 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
29da0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
29db0 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72  den', omit it fr
29dc0 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  om the expanded.
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
29de0 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75  esult-set list u
29df0 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54  nless the SELECT
29e00 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c   has the SF_Incl
29e10 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20  udeHidden.      
29e20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74        ** bit set
29e30 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
29e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29e50 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
29e60 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
29e70 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
29e80 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c    && IsHiddenCol
29e90 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
29ea0 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  j]) .           
29eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29ec0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
29ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29ee0 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
29ef0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
29f00 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
29f10 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
29f20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
29f30 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om->fg.jointype 
29f40 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
29f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29f60 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
29f70 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
29f80 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
29f90 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
29fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29fb0 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
29fc0 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
29fd0 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
29fe0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
29ff0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
2a000 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
2a010 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2a030 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2a040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a050 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2a060 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
2a070 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
2a080 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
2a090 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
2a0a0 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
2a0b0 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
2a0c0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2a0e0 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
2a0f0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
2a100 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2a120 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2a130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a150 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
2a160 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
2a170 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
2a180 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
2a190 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
2a1a0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
2a1b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a1c0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
2a1d0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
2a1e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a1f0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
2a200 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2a210 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2a220 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
2a230 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2a240 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2a250 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2a260 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
2a270 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
2a280 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
2a290 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
2a2a0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
2a2b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2a2c0 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
2a2d0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2a2e0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2a2f0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2a300 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
2a310 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  t, pExpr);.     
2a320 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a330 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
2a340 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
2a350 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
2a360 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
2a370 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
2a380 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
2a390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2a3a0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
2a3b0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
2a3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a3d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a3e0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
2a3f0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
2a400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a410 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2a420 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
2a430 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
2a440 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2a450 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
2a460 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f  t(&sColname, zCo
2a470 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
2a480 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2a490 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
2a4a0 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
2a4b0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
2a4c0 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
2a4d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2a4e0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
2a4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a500 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2a510 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
2a520 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
2a530 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
2a540 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
2a570 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
2a580 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
2a590 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
2a5a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2a5b0 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
2a5c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2a5d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a5e0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
2a5f0 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
2a600 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
2a610 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a640 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
2a650 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
2a660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a670 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
2a680 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
2a690 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a6a0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
2a6b0 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
2a6c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a6d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2a6e0 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
2a6f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
2a700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a710 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
2a720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2a730 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
2a740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2a750 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2a760 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
2a770 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
2a780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2a790 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2a7a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2a7b0 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
2a7c0 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
2a7d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a7e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a7f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2a800 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
2a810 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
2a820 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
2a830 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
2a840 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45  ){.    if( p->pE
2a850 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
2a860 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2a870 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
2a880 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2a890 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
2a8a0 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
2a8b0 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
2a8c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2a8d0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2a8e0 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67    if( (elistFlag
2a8f0 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c  s & (EP_HasFunc|
2a900 45 50 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30  EP_Subquery))!=0
2a910 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c   ){.      p->sel
2a920 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70  Flags |= SF_Comp
2a930 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d  lexResult;.    }
2a940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2a950 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2a960 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
2a970 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
2a980 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
2a990 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
2a9a0 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
2a9b0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2a9c0 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
2a9d0 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
2a9e0 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
2a9f0 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
2aa00 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
2aa10 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
2aa20 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
2aa30 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2aa40 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
2aa50 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
2aa60 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2aa70 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
2aa80 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
2aa90 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
2aaa0 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
2aab0 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
2aac0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2aad0 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
2aae0 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
2aaf0 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
2ab00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2ab10 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2ab20 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
2ab30 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2ab40 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
2ab50 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
2ab60 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72  -tree walker for
2ab70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2ab80 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ts..** subquery 
2ab90 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
2aba0 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ee..*/.int sqlit
2abb0 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
2abc0 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
2abd0 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
2abe0 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
2abf0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2ac00 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
2ac10 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2ac20 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ue;.}..#if SQLIT
2ac30 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c  E_DEBUG./*.** Al
2ac40 77 61 79 73 20 61 73 73 65 72 74 2e 20 20 54 68  ways assert.  Th
2ac50 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  is xSelectCallba
2ac60 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ck2 implementati
2ac70 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74 20 74  on proves that t
2ac80 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c  he.** xSelectCal
2ac90 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20  lback2 is never 
2aca0 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  invoked..*/.void
2acb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
2acc0 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72  lkAssert2(Walker
2acd0 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63   *NotUsed, Selec
2ace0 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  t *NotUsed2){.  
2acf0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ad00 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
2ad10 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed2);.  assert( 
2ad20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a  0 );.}.#endif./*
2ad30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ad40 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
2ad50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
2ad60 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2ad70 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
2ad80 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2ad90 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
2ada0 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
2adb0 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
2adc0 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
2add0 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
2ade0 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
2adf0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
2ae00 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
2ae10 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
2ae20 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
2ae30 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
2ae40 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
2ae50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
2ae60 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2ae70 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
2ae80 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
2ae90 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2aea0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
2aeb0 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
2aec0 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
2aed0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2aee0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
2aef0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
2af00 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
2af10 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
2af20 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
2af30 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
2af40 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
2af50 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2af60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2af70 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2af80 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
2af90 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2afa0 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
2afb0 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
2afc0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
2afd0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
2afe0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2aff0 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
2b000 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65  WAYS_TRUE(pParse
2b010 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29  ->hasCompound) )
2b020 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
2b030 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
2b040 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
2b050 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77  oSubquery;.    w
2b060 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2b070 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  2 = 0;.    sqlit
2b080 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
2b090 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
2b0a0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2b0b0 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
2b0c0 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  der;.  w.xSelect
2b0d0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
2b0e0 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c  ctPopWith;.  sql
2b0f0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2b100 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
2b110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b120 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
2b130 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
2b140 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
2b150 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
2b160 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
2b170 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
2b180 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
2b190 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
2b1a0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
2b1b0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
2b1c0 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
2b1d0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
2b1e0 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
2b1f0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
2b200 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
2b210 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
2b220 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
2b230 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
2b240 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
2b250 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
2b260 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
2b270 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
2b280 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
2b290 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
2b2a0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
2b2b0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
2b2c0 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
2b2d0 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
2b2e0 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
2b2f0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
2b300 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
2b310 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2b320 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
2b330 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
2b340 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
2b350 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2b360 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2b370 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2b380 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
2b390 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
2b3a0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
2b3b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2b3c0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
2b3d0 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
2b3e0 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
2b3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
2b400 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
2b410 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
2b420 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
2b430 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
2b440 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
2b450 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
2b460 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2b470 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
2b480 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
2b490 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
2b4a0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
2b4b0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2b4c0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
2b4d0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2b4e0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
2b4f0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2b500 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2b510 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
2b520 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
2b530 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2b540 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
2b550 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
2b560 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
2b570 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
2b580 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
2b590 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
2b5a0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
2b5b0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
2b5c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2b5d0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
2b5e0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
2b5f0 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
2b600 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2b610 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2b620 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
2b630 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
2b640 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2b650 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
2b660 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
2b670 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
2b680 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2b690 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
2b6a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2b6b0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
2b6c0 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
2b6d0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
2b6e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2b6f0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
2b700 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
2b710 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2b720 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
2b730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2b740 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
2b750 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2b760 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
2b770 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
2b780 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2b790 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
2b7a0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
2b7b0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2b7c0 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
2b7d0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
2b7e0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2b7f0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b800 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2b810 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2b820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
2b830 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
2b840 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
2b850 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
2b860 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
2b870 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
2b880 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
2b890 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
2b8a0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
2b8b0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
2b8c0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
2b8d0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
2b8e0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
2b8f0 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
2b900 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
2b910 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
2b920 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2b930 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
2b940 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
2b950 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
2b960 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
2b970 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
2b980 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
2b990 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
2b9a0 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
2b9b0 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
2b9c0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
2b9d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2b9e0 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
2b9f0 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
2ba00 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
2ba10 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
2ba20 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
2ba30 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
2ba40 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2ba50 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2ba60 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2ba70 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2ba80 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2ba90 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2baa0 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
2bab0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
2bac0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2bad0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
2bae0 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
2baf0 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
2bb00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2bb10 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2bb20 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2bb30 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
2bb40 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2bb50 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
2bb60 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
2bb70 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
2bb80 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
2bb90 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2bba0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2bbb0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2bbc0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
2bbd0 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
2bbe0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
2bbf0 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
2bc00 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
2bc10 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2bc20 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2bc30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2bc40 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
2bc50 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
2bc60 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
2bc70 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
2bc80 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
2bc90 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2bca0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
2bcb0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
2bcc0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
2bcd0 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
2bce0 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
2bcf0 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
2bd00 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
2bd10 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
2bd20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
2bd30 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
2bd40 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
2bd50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2bd60 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
2bd70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2bd80 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2bd90 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2bda0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2bdb0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2bdc0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
2bdd0 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
2bde0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
2bdf0 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
2be00 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
2be10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
2be20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2be30 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2be40 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
2be50 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
2be60 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
2be70 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
2be80 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
2be90 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
2bea0 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
2beb0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
2bec0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
2bed0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2bee0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
2bef0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
2bf00 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2bf10 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
2bf20 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2bf30 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2bf40 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2bf50 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
2bf60 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
2bf70 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2bf80 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2bf90 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2bfa0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
2bfb0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2bfc0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2bfd0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2bfe0 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2bff0 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
2c000 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
2c010 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2c020 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
2c030 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
2c040 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
2c050 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
2c060 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
2c070 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2c080 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
2c090 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
2c0a0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2c0b0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2c0c0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
2c0d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2c0e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
2c0f0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2c100 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
2c110 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
2c120 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
2c130 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
2c140 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2c150 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
2c160 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
2c170 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
2c180 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
2c190 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
2c1a0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
2c1b0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2c1c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
2c1d0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2c1e0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c1f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2c200 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
2c210 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c220 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2c230 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2c240 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
2c250 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c270 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
2c280 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2c290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c2a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
2c2b0 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
2c2c0 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
2c2d0 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
2c2e0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
2c2f0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
2c300 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
2c310 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
2c320 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
2c330 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2c340 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2c350 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2c360 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2c370 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
2c380 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
2c390 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2c3a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2c3b0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2c3c0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2c3d0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2c3e0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
2c3f0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
2c400 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2c410 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
2c420 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2c430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c440 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp2(v, OP_AggFi
2c450 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
2c460 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
2c470 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71  xpr : 0);.    sq
2c480 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
2c490 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20  4(v, pF->pFunc, 
2c4a0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
2c4b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
2c4c0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2c4d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
2c4e0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
2c4f0 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
2c500 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2c510 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
2c520 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
2c530 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
2c540 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
2c550 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
2c560 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2c570 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2c580 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30    int regHit = 0
2c590 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54  ;.  int addrHitT
2c5a0 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  est = 0;.  struc
2c5b0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2c5c0 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
2c5d0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
2c5e0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2c5f0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
2c600 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
2c610 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
2c620 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2c630 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
2c640 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
2c650 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
2c660 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20   int regAgg;.   
2c670 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2c680 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
2c690 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
2c6a0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2c6b0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
2c6c0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2c6d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
2c6e0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
2c6f0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
2c700 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
2c710 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2c720 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
2c730 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2c740 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2c750 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
2c760 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45  g, 0, SQLITE_ECE
2c770 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73  L_DUP);.    }els
2c780 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
2c790 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
2c7a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
2c7b0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
2c7c0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
2c7d0 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
2c7e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2c7f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c800 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20   nArg==0 );  /* 
2c810 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  Error condition 
2c820 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
2c830 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f  e( nArg>1 );   /
2c840 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20  * Also an error 
2c850 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  */.      codeDis
2c860 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
2c870 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
2c880 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
2c890 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2c8a0 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
2c8b0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2c8c0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2c8d0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
2c8e0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
2c8f0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2c900 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2c910 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2c920 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2c930 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
2c940 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
2c950 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
2c960 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
2c970 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
2c980 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
2c990 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2c9a0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2c9b0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2c9c0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
2c9d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
2c9e0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2c9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
2ca00 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2ca10 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2ca20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
2ca30 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2ca40 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2ca50 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
2ca60 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2ca70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ca80 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
2ca90 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
2caa0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
2cab0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
2cac0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2cad0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
2cae0 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41  ggStep0, 0, regA
2caf0 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20  gg, pF->iMem);. 
2cb00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2cb10 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46  pendP4(v, pF->pF
2cb20 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
2cb30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2cb40 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
2cb50 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
2cb60 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
2cb70 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
2cb80 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
2cb90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
2cba0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2cbb0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2cbc0 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
2cbd0 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
2cbe0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2cbf0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
2cc00 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
2cc10 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2cc20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2cc30 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
2cc40 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
2cc50 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2cc60 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
2cc70 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
2cc80 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
2cc90 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
2cca0 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
2ccb0 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
2ccc0 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
2ccd0 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
2cce0 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
2ccf0 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
2cd00 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
2cd10 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
2cd20 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
2cd30 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
2cd40 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
2cd50 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
2cd60 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
2cd70 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
2cd80 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
2cd90 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
2cda0 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
2cdb0 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
2cdc0 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
2cdd0 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
2cde0 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
2cdf0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
2ce00 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
2ce10 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
2ce20 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
2ce30 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
2ce40 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
2ce50 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
2ce60 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
2ce70 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2ce80 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
2ce90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
2cea0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2ceb0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2cec0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
2ced0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
2cee0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
2cef0 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
2cf00 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
2cf10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2cf20 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
2cf30 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
2cf40 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2cf50 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
2cf60 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2cf70 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
2cf80 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
2cf90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2cfa0 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
2cfb0 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
2cfc0 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
2cfd0 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
2cfe0 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
2cff0 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
2d000 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
2d010 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
2d020 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d030 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
2d040 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d050 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
2d060 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
2d070 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
2d080 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2d090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2d0a0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2d0b0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0d0 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2d0e0 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
2d0f0 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2d100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d110 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
2d120 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
2d130 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
2d140 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2d150 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
2d160 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
2d170 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
2d180 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
2d190 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
2d1a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2d1b0 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c  eExplain(pParse,
2d1c0 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20   0, "SCAN TABLE 
2d1d0 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
2d1e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
2d1f0 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
2d200 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
2d210 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
2d220 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
2d230 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
2d240 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
2d250 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
2d260 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
2d270 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
2d280 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
2d290 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
2d2a0 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57  sed by havingToW
2d2b0 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  here()..**.** If
2d2c0 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64   the node passed
2d2d0 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
2d2e0 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64   is a TK_AND nod
2d2f0 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52  e, return .** WR
2d300 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65  C_Continue to te
2d310 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ll sqlite3WalkEx
2d320 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20  pr() to iterate 
2d330 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f  through child no
2d340 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  des..**.** Other
2d350 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43  wise, return WRC
2d360 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20  _Prune. In this 
2d370 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b  case, also check
2d380 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
2d390 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
2d3a0 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20  es the criteria 
2d3b0 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  for being moved 
2d3c0 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
2d3d0 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61  clause. If so, a
2d3e0 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45  dd it to the WHE
2d3f0 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65  RE clause and re
2d400 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78  place the sub-ex
2d410 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68  pression.** with
2d420 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  in the HAVING ex
2d430 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20  pression with a 
2d440 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f  constant "1"..*/
2d450 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69  .static int havi
2d460 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28  ngToWhereExprCb(
2d470 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2d480 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2d490 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2d4a0 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65  TK_AND ){.    Se
2d4b0 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b  lect *pS = pWalk
2d4c0 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20  er->u.pSelect;. 
2d4d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2d4e0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
2d4f0 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70  oupBy(pWalker->p
2d500 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
2d510 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20  ->pGroupBy) ){. 
2d520 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2d530 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2d540 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78  se->db;.      Ex
2d550 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
2d560 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
2d570 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
2d580 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
2d590 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2d5a0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
2d5b0 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70  Expr *pWhere = p
2d5c0 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  S->pWhere;.     
2d5d0 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70     SWAP(Expr, *p
2d5e0 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20  New, *pExpr);.  
2d5f0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2d600 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2d610 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
2d620 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72         pS->pWher
2d630 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
2d640 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2d650 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2d660 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57    }.    return W
2d670 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
2d680 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d690 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  nue;.}../*.** Tr
2d6a0 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20  ansfer eligible 
2d6b0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48  terms from the H
2d6c0 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  AVING clause of 
2d6d0 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69  a query, which i
2d6e0 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61  s.** processed a
2d6f0 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74  fter grouping, t
2d700 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2d710 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f  se, which is pro
2d720 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a  cessed before.**
2d730 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65   grouping. For e
2d740 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72  xample, the quer
2d750 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
2d760 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73  T * FROM <tables
2d770 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55  > WHERE a=? GROU
2d780 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d  P BY b HAVING b=
2d790 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20  ? AND c=?.**.** 
2d7a0 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
2d7b0 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   as:.**.**   SEL
2d7c0 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
2d7d0 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e  es> WHERE a=? AN
2d7e0 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  D b=? GROUP BY b
2d7f0 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a   HAVING c=?.**.*
2d800 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
2d810 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
2d820 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f  n is eligible fo
2d830 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74  r transfer if it
2d840 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74   consists.** ent
2d850 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
2d860 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f  ts and expressio
2d870 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
2d880 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2d890 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20  that.** use the 
2d8a0 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69  "BINARY" collati
2d8b0 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  on sequence..*/.
2d8c0 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69  static void havi
2d8d0 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20  ngToWhere(Parse 
2d8e0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2d8f0 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  *p){.  Walker sW
2d900 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  alker;.  memset(
2d910 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
2d920 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
2d930 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
2d940 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
2d950 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2d960 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72  k = havingToWher
2d970 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
2d980 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70  er.u.pSelect = p
2d990 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2d9a0 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d  xpr(&sWalker, p-
2d9b0 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53  >pHaving);.#if S
2d9c0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2d9d0 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72  ED.  if( sWalker
2d9e0 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74  .eCode && (sqlit
2d9f0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2da00 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
2da10 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2da20 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f  00,pParse,p,("Mo
2da30 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20  ve HAVING terms 
2da40 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29  into WHERE:\n"))
2da50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2da60 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2da70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2da80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2da90 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54  to see if the pT
2daa0 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61  his entry of pTa
2dab0 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d  bList is a self-
2dac0 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20  join of a prior 
2dad0 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69  view..** If it i
2dae0 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  s, then return t
2daf0 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
2db00 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69  for the prior vi
2db10 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ew.  If it is no
2db20 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
2db30 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  n 0..*/.static s
2db40 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2db50 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69  em *isSelfJoinVi
2db60 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ew(.  SrcList *p
2db70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
2db80 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2db90 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74   self-joins in t
2dba0 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  his FROM clause 
2dbb0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
2dbc0 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20  ist_item *pThis 
2dbd0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2dbe0 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20  prior reference 
2dbf0 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79  to this subquery
2dc00 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2dc10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2dc20 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  tem;.  for(pItem
2dc30 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20   = pTabList->a; 
2dc40 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74  pItem<pThis; pIt
2dc50 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  em++){.    if( p
2dc60 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  Item->pSelect==0
2dc70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2dc80 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
2dc90 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f  iaCoroutine ) co
2dca0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2dcb0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
2dcc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2dcd0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2dce0 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61  cmp(pItem->zData
2dcf0 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61  base, pThis->zDa
2dd00 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e  tabase)!=0 ) con
2dd10 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
2dd20 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
2dd30 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68  Item->zName, pTh
2dd40 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20  is->zName)!=0 ) 
2dd50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2dd60 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2dd70 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20  pare(0, .       
2dd80 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63     pThis->pSelec
2dd90 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  t->pWhere, pItem
2dda0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2ddb0 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20  e, -1) .    ){. 
2ddc0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77       /* The view
2ddd0 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79   was modified by
2dde0 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69   some other opti
2ddf0 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73  mization such as
2de00 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f  .      ** pushDo
2de10 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a  wnWhereTerms() *
2de20 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
2de30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2de40 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20  rn pItem;.  }.  
2de50 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
2de60 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54  def SQLITE_COUNT
2de70 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2de80 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  ION./*.** Attemp
2de90 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  t to transform a
2dea0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
2deb0 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  rm.**.**    SELE
2dec0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2ded0 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
2dee0 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
2def0 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a  ECT y FROM t2).*
2df00 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a  *.** Into this:.
2df10 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2df20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
2df30 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43   FROM t1)+(SELEC
2df40 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2df50 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72  t2).**.** The tr
2df60 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c  ansformation onl
2df70 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f  y works if all o
2df80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2df90 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
2dfa0 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72    *  The subquer
2dfb0 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  y is a UNION ALL
2dfc0 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
2dfd0 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68  terms.**   *  Th
2dfe0 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20  ere is no WHERE 
2dff0 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  or GROUP BY or H
2e000 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e  AVING clauses on
2e010 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
2e020 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65  **   *  The oute
2e030 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  r query is a sim
2e040 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a  ple count(*).**.
2e050 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2e060 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2e070 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e  on is undertaken
2e080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e090 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
2e0a0 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  ization(Parse *p
2e0b0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
2e0c0 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
2e0d0 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78  b, *pPrior;.  Ex
2e0e0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
2e0f0 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c  r *pCount;.  sql
2e100 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2e110 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2e120 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20  F_Aggregate)==0 
2e130 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
2e140 20 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72   This is an aggr
2e150 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70  egate */.  if( p
2e160 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
2e170 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e190 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  Single result co
2e1a0 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20  lumn */.  pExpr 
2e1b0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
2e1c0 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
2e1d0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
2e1e0 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
2e1f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
2e200 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67  Result is an agg
2e210 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20  regate */.  if( 
2e220 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2e230 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
2e240 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72  "count") ) retur
2e250 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e  n 0;  /* Is coun
2e260 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  t() */.  if( pEx
2e270 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29  pr->x.pList!=0 )
2e280 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2e290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
2e2a0 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a  st be count(*) *
2e2b0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d  /.  if( p->pSrc-
2e2c0 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
2e2d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2e2e0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62        /* One tab
2e2f0 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20  le in FROM  */. 
2e300 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
2e310 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
2e320 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72   if( pSub==0 ) r
2e330 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e350 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69     /* The FROM i
2e360 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  s a subquery */.
2e370 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
2e380 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  or==0 ) return 0
2e390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e3a0 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61      /* Must be a
2e3b0 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a   compound ry */.
2e3c0 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53    do{.    if( pS
2e3d0 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  ub->op!=TK_ALL &
2e3e0 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  & pSub->pPrior )
2e3f0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d   return 0;  /* M
2e400 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c  ust be UNION ALL
2e410 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
2e420 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
2e430 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2e440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
2e450 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2e460 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65      if( pSub->se
2e470 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2e480 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30  egate ) return 0
2e490 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20  ;     /* Not an 
2e4a0 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20  aggregate */.   
2e4b0 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50   pSub = pSub->pP
2e4c0 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rior;           
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4e0 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65     /* Repeat ove
2e4f0 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  r compound */.  
2e500 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a  }while( pSub );.
2e510 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
2e520 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  h this point the
2e530 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65  n it is OK to pe
2e540 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66  rform the transf
2e550 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  ormation */..  d
2e560 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2e570 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72    pCount = pExpr
2e580 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20  ;.  pExpr = 0;. 
2e590 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
2e5a0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
2e5b0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
2e5c0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71  Select = 0;.  sq
2e5d0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
2e5e0 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b  te(db, p->pSrc);
2e5f0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c  .  p->pSrc = sql
2e600 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
2e610 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
2e620 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a  eof(*p->pSrc));.
2e630 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b    while( pSub ){
2e640 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d  .    Expr *pTerm
2e650 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
2e660 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sub->pPrior;.   
2e670 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20   pSub->pPrior = 
2e680 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65  0;.    pSub->pNe
2e690 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  xt = 0;.    pSub
2e6a0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2e6b0 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
2e6c0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2e6d0 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
2e6e0 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63      pSub->nSelec
2e6f0 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71  tRow = 0;.    sq
2e700 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2e710 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  ete(db, pSub->pE
2e720 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d  List);.    pTerm
2e730 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69   = pPrior ? sqli
2e740 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
2e750 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75  Count, 0) : pCou
2e760 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45  nt;.    pSub->pE
2e770 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
2e780 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
2e790 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a  rse, 0, pTerm);.
2e7a0 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
2e7b0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2e7c0 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30   TK_SELECT, 0, 0
2e7d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45  );.    sqlite3PE
2e7e0 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61  xprAddSelect(pPa
2e7f0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62  rse, pTerm, pSub
2e800 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
2e810 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ==0 ){.      pEx
2e820 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  pr = pTerm;.    
2e830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78  }else{.      pEx
2e840 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
2e850 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55  r(pParse, TK_PLU
2e860 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29  S, pTerm, pExpr)
2e870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
2e880 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20   = pPrior;.  }. 
2e890 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
2e8a0 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
2e8b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2e8c0 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
2e8d0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2e8e0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2e8f0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2e900 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
2e910 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
2e920 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
2e930 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65  ter count-of-vie
2e940 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c  w optimization:\
2e950 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2e960 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2e970 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2e980 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b  ndif.  return 1;
2e990 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2e9a0 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
2e9b0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
2e9c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2e9d0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
2e9e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
2e9f0 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
2ea00 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
2ea10 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
2ea20 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
2ea30 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
2ea40 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
2ea50 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
2ea60 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
2ea70 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
2ea80 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
2ea90 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2eaa0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2eab0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
2eac0 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
2ead0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
2eae0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
2eaf0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2eb00 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
2eb10 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2eb20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2eb30 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
2eb40 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
2eb50 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
2eb60 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
2eb70 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
2eb80 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
2eb90 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
2eba0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2ebb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2ebc0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2ebd0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2ebe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ebf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2ec00 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2ec10 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
2ec20 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
2ec30 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
2ec40 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
2ec50 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
2ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ec70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2ec80 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2ec90 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
2eca0 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
2ecb0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
2ecc0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
2ecd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ece0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
2ecf0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
2ed00 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
2ed10 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
2ed20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
2ed30 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
2ed40 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
2ed50 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
2ed60 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
2ed70 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
2ed80 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
2ed90 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
2eda0 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2edb0 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
2edc0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2edd0 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
2ede0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2edf0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2ee00 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
2ee10 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
2ee20 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
2ee30 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2ee40 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
2ee50 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
2ee60 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2ee70 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2ee80 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
2ee90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2eea0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
2eeb0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
2eec0 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
2eed0 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
2eee0 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2eef0 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
2ef00 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
2ef10 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
2ef20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
2ef30 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2ef40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ef50 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
2ef60 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
2ef70 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
2ef80 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
2ef90 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
2efa0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2efb0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
2efc0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
2efd0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
2efe0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2eff0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2f000 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2f010 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
2f020 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f  xOrderBy = 0;  /
2f030 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42 59  * Added ORDER BY
2f040 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65   for min/max que
2f050 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e  ries */.  u8 min
2f060 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20  MaxFlag;        
2f070 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2f080 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65   for min/max que
2f090 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  ries */..  db = 
2f0a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
2f0b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
2f0c0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2f0d0 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
2f0e0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
2f0f0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
2f100 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2f110 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
2f120 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2f130 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
2f140 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
2f150 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
2f160 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
2f170 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53  AggInfo));.#if S
2f180 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2f190 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
2f1a0 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62  (1,pParse,p, ("b
2f1b0 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a  egin processing:
2f1c0 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  \n", pParse->add
2f1d0 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66  rExplain));.  if
2f1e0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2f1f0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2f200 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2f210 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2f220 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2f230 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2f240 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2f250 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
2f260 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
2f270 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2f280 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2f290 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
2f2a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2f2b0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2f2c0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
2f2d0 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
2f2e0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2f2f0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2f300 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
2f310 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
2f320 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2f330 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
2f340 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f350 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
2f360 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
2f370 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
2f380 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2f390 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
2f3a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2f3b0 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
2f3c0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2f3d0 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
2f3e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2f3f0 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
2f400 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2f410 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
2f420 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
2f430 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
2f440 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
2f450 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
2f460 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
2f470 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
2f480 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
2f490 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
2f4a0 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
2f4b0 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
2f4c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2f4d0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
2f4e0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
2f4f0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
2f500 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
2f510 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
2f520 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
2f530 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
2f540 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
2f550 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
2f560 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
2f570 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
2f580 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
2f590 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
2f5a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
2f5b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2f5c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
2f5d0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73  ct_end;.  }.  as
2f5e0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
2f5f0 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20  =0 );.  isAgg = 
2f600 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2f610 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2f620 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2f630 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2f640 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2f650 65 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20  e & 0x104 ){.   
2f660 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2f670 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  04,pParse,p, ("a
2f680 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
2f690 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
2f6a0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2f6b0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2f6c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2f6d0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
2f6e0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
2f6f0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
2f700 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
2f710 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20  ;.  }..  /* Try 
2f720 74 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  to various optim
2f730 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65  izations (flatte
2f740 6e 69 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c  ning subqueries,
2f750 20 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20   and strength.  
2f760 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20  ** reduction of 
2f770 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20  join operators) 
2f780 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2f790 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d  se up into the m
2f7a0 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23  ain query.  */.#
2f7b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2f7c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2f7d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2f7e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2f7f0 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
2f800 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
2f810 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2f820 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2f830 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2f840 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2f850 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ];.    Select *p
2f860 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
2f870 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20  lect;.    Table 
2f880 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
2f890 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  Tab;..    /* Con
2f8a0 76 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69  vert LEFT JOIN i
2f8b0 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72  nto JOIN if ther
2f8c0 65 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74  e are terms of t
2f8d0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20  he right table. 
2f8e0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46     ** of the LEF
2f8f0 54 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74  T JOIN used in t
2f900 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
2f910 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2f920 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
2f930 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
2f940 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
2f950 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e  3ExprImpliesNonN
2f960 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65  ullRow(p->pWhere
2f970 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2f980 29 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  ).     && Optimi
2f990 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2f9a0 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66  , SQLITE_Simplif
2f9b0 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20  yJoin).    ){.  
2f9c0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2f9d0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a  0x100,pParse,p,.
2f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9f0 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70  ("LEFT-JOIN simp
2fa00 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f  lifies to JOIN o
2fa10 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29  n term %d\n",i))
2fa20 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
2fa30 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28  g.jointype &= ~(
2fa40 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
2fa50 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
2fa60 69 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  inExpr(p->pWhere
2fa70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2fa80 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
2fa90 20 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f   No futher actio
2faa0 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f  n if this term o
2fab0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2fac0 65 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65  e is no a subque
2fad0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  ry */.    if( pS
2fae0 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2faf0 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
2fb00 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
2fb10 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
2fb20 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
2fb30 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
2fb40 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
2fb50 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
2fb60 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
2fb70 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
2fb80 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
2fb90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2fba0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2fbb0 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
2fbc0 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
2fbd0 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
2fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbf0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
2fc00 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
2fc10 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
2fc20 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
2fc30 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
2fc40 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79     /* Do not try
2fc50 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61   to flatten an a
2fc60 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
2fc70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
2fc80 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61   Flattening an a
2fc90 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
2fca0 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  y is only possib
2fcb0 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  le if the outer 
2fcc0 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20  query.    ** is 
2fcd0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74  not a join.  But
2fce0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
2fcf0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
2fd00 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71  n, then the subq
2fd10 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  uery.    ** will
2fd20 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
2fd30 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
2fd40 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2fd50 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20  advantage to.   
2fd60 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   ** flattening i
2fd70 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
2fd80 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75   */.    if( (pSu
2fd90 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2fda0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29  _Aggregate)!=0 )
2fdb0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
2fdc0 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72  ssert( pSub->pGr
2fdd0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  oupBy==0 );..   
2fde0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72   /* If the outer
2fdf0 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
2fe00 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75  a "complex" resu
2fe10 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c  lt set (that is,
2fe20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72  .    ** if the r
2fe30 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
2fe40 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65   outer query use
2fe50 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73  s functions or s
2fe60 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a  ubqueries).    *
2fe70 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62  * and if the sub
2fe80 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
2fe90 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2fea0 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20  e and if.    ** 
2feb0 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  it will be imple
2fec0 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
2fed0 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20  outine, then do 
2fee0 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68  not flatten.  Th
2fef0 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69  is.    ** restri
2ff00 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c  ction allows SQL
2ff10 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65   constructs like
2ff20 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
2ff30 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70    **  SELECT exp
2ff40 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2ff50 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f  x).    **    FRO
2ff60 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
2ff70 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
2ff80 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
2ff90 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70  *.    ** The exp
2ffa0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2ffb0 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74  ) is only comput
2ffc0 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77  ed on the 10 row
2ffd0 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
2ffe0 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72  e output, rather
2fff0 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20   than every row 
30000 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
30010 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
30020 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
30030 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
30040 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20   have a complex 
30050 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a  result set.    *
30060 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61  * means that fla
30070 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63  ttening does occ
30080 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51  ur on simpler SQ
30090 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  L constraints wi
300a0 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  thout.    ** the
300b0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
300c0 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20  ion() like:.    
300d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
300e0 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
300f0 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
30100 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
30110 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ;.    */.    if(
30120 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21   pSub->pOrderBy!
30130 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a  =0.     && i==0.
30140 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
30150 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65  lags & SF_Comple
30160 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20  xResult)!=0.    
30170 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
30180 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
30190 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
301a0 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
301b0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
301c0 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
301d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
301e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61    }..    if( fla
301f0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
30200 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
30210 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
30220 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
30230 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
30240 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
30250 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
30260 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
30270 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
30280 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
30290 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
302a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
302b0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
302c0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
302d0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
302e0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
302f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
30300 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30310 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
30320 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
30330 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
30340 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
30350 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
30360 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
30370 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
30380 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
30390 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
303a0 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
303b0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69  e, p, pDest);.#i
303c0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
303d0 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54  ABLED.    SELECT
303e0 54 52 41 43 45 28 30 78 31 2c 70 50 61 72 73 65  TRACE(0x1,pParse
303f0 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e  ,p,("end compoun
30400 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  d-select process
30410 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66  ing\n"));.    if
30420 28 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ( (sqlite3Select
30430 54 72 61 63 65 20 26 20 30 78 32 30 30 30 29 21  Trace & 0x2000)!
30440 3d 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65  =0 && ExplainQue
30450 72 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61  ryPlanParent(pPa
30460 72 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rse)==0 ){.     
30470 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
30480 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
30490 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
304a0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d    if( p->pNext==
304b0 30 20 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79  0 ) ExplainQuery
304c0 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b  PlanPop(pParse);
304d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
304e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
304f0 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   For each term i
30500 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
30510 65 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67 73  e, do two things
30520 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75 74 68 6f  :.  ** (1) Autho
30530 72 69 7a 65 64 20 75 6e 72 65 66 65 72 65 6e 63  rized unreferenc
30540 65 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28  ed tables.  ** (
30550 32 29 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  2) Generate code
30560 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
30570 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ries.  */.  for(
30580 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
30590 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
305a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
305b0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
305c0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
305d0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
305e0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
305f0 70 53 75 62 3b 0a 23 69 66 20 21 64 65 66 69 6e  pSub;.#if !defin
30600 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
30610 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
30620 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
30630 5f 56 49 45 57 29 0a 20 20 20 20 63 6f 6e 73 74  _VIEW).    const
30640 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
30650 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66  hContext;.#endif
30660 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20 53  ..    /* Issue S
30670 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f  QLITE_READ autho
30680 72 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20 61  rizations with a
30690 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
306a0 65 20 66 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a  e for any.    **
306b0 20 74 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   tables that are
306c0 20 72 65 66 65 72 65 6e 63 65 64 20 62 75 74 20   referenced but 
306d0 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76 61  from which no va
306e0 6c 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74  lues are extract
306f0 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ed..    ** Examp
30700 6c 65 73 20 6f 66 20 77 68 65 72 65 20 74 68 65  les of where the
30710 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c  se kinds of null
30720 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74   SQLITE_READ aut
30730 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20  horizations.    
30740 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a  ** would occur:.
30750 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
30760 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
30770 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20  ) FROM t1;   -- 
30780 53 51 4c 49 54 45 5f 52 45 41 44 20 74 31 2e 22  SQLITE_READ t1."
30790 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  ".    **     SEL
307a0 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31  ECT t1.* FROM t1
307b0 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54  , t2;   -- SQLIT
307c0 45 5f 52 45 41 44 20 74 32 2e 22 22 0a 20 20 20  E_READ t2."".   
307d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
307e0 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
307f0 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
30800 6e 67 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  ng.  It is possi
30810 62 6c 65 20 66 6f 72 20 61 20 74 61 62 6c 65 20  ble for a table 
30820 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 61  to.    ** have a
30830 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79   column named by
30840 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e   the empty strin
30850 67 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  g, in which case
30860 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
30870 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74 69   to.    ** disti
30880 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20 61  nguish between a
30890 6e 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  n unreferenced t
308a0 61 62 6c 65 20 61 6e 64 20 61 6e 20 61 63 74 75  able and an actu
308b0 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
308c0 74 68 65 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f  the.    ** "" co
308d0 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e  lumn. The origin
308e0 61 6c 20 64 65 73 69 67 6e 20 77 61 73 20 66 6f  al design was fo
308f0 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  r the fake colum
30900 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20 61 20 4e  n name to be a N
30910 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63  ULL,.    ** whic
30920 68 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62  h would be unamb
30930 69 67 75 6f 75 73 2e 20 20 42 75 74 20 6c 65 67  iguous.  But leg
30940 61 63 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  acy authorizatio
30950 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68  n callbacks migh
30960 74 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 20  t.    ** assume 
30970 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
30980 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20  is non-NULL and 
30990 73 65 67 66 61 75 6c 74 2e 20 20 54 68 65 20 75  segfault.  The u
309a0 73 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20  se of an empty. 
309b0 20 20 20 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72     ** string for
309c0 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   the fake column
309d0 20 6e 61 6d 65 20 73 65 65 6d 73 20 73 61 66 65   name seems safe
309e0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
309f0 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  ( pItem->colUsed
30a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
30a10 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
30a20 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 41  arse, SQLITE_REA
30a30 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  D, pItem->zName,
30a40 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74   "", pItem->zDat
30a50 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23  abase);.    }..#
30a60 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
30a70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
30a80 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
30a90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
30aa0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
30ab0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
30ac0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
30ad0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
30ae0 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 49  */.    pSub = pI
30af0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
30b00 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
30b10 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
30b20 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20  * Sometimes the 
30b30 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75  code for a subqu
30b40 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ery will be gene
30b50 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a  rated more than.
30b60 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20      ** once, if 
30b70 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
30b80 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52  part of the WHER
30b90 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45  E clause in a LE
30ba0 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20  FT JOIN,.    ** 
30bb0 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e  for example.  In
30bc0 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e   that case, do n
30bd0 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68  ot regenerate th
30be0 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65  e code to manife
30bf0 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77  st.    ** a view
30c00 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   or the co-routi
30c10 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ne to implement 
30c20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72  a view.  The fir
30c30 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20  st instance.    
30c40 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
30c50 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62  , though the sub
30c60 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66  routine to manif
30c70 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65  est the view doe
30c80 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  s need.    ** to
30c90 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69   be invoked agai
30ca0 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  n. */.    if( pI
30cb0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
30cc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
30cd0 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
30ce0 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
30cf0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 72 6f 75     /* The subrou
30d00 74 69 6e 65 20 74 68 61 74 20 6d 61 6e 69 66 65  tine that manife
30d10 73 74 73 20 74 68 65 20 76 69 65 77 20 6d 69 67  sts the view mig
30d20 68 74 20 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65  ht be a one-time
30d30 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20   routine,.      
30d40 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69 67 68 74    ** or it might
30d50 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 72 75   need to be reru
30d60 6e 20 6f 6e 20 65 61 63 68 20 69 74 65 72 61 74  n on each iterat
30d70 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74 0a 20  ion because it. 
30d80 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65         ** encode
30d90 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
30da0 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  ubquery. */.    
30db0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
30dc0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
30dd0 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
30de0 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  lSub)->opcode==O
30df0 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20 20 20 20  P_Once );.      
30e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30e10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
30e20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
30e30 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  n, pItem->addrFi
30e40 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a  llSub);.      }.
30e50 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
30e60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
30e70 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
30e80 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
30e90 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
30ea0 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
30eb0 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72    ** tree referr
30ec0 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
30ed0 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
30ee0 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
30ef0 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
30f00 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
30f10 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
30f20 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
30f30 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
30f40 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
30f50 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
30f60 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
30f70 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
30f80 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
30f90 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
30fa0 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
30fb0 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
30fc0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
30fd0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
30fe0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
30ff0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
31000 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65     /* Make copie
31010 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48  s of constant WH
31020 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE-clause terms
31030 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
31040 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20  ery down.    ** 
31050 69 6e 73 69 64 65 20 74 68 65 20 73 75 62 71 75  inside the subqu
31060 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68  ery.  This can h
31070 65 6c 70 20 74 68 65 20 73 75 62 71 75 65 72 79  elp the subquery
31080 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66   to run more eff
31090 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f  iciently..    */
310a0 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  .    if( Optimiz
310b0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
310c0 20 53 51 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e   SQLITE_PushDown
310d0 29 0a 20 20 20 20 20 26 26 20 70 75 73 68 44 6f  ).     && pushDo
310e0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
310f0 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57  rse, pSub, p->pW
31100 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
31110 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  rsor,.          
31120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31130 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
31140 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
31150 21 3d 30 29 0a 20 20 20 20 29 7b 0a 23 69 66 20  !=0).    ){.#if 
31160 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
31170 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73 71  LED.      if( sq
31180 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
31190 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
311a0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
311b0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
311c0 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61  "After WHERE-cla
311d0 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e  use push-down:\n
311e0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  "));.        sql
311f0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
31200 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
31210 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 45 4c  }else{.      SEL
31230 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
31240 50 61 72 73 65 2c 70 2c 28 22 50 75 73 68 2d 64  Parse,p,("Push-d
31250 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  own not possible
31260 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  \n"));.    }..  
31270 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
31280 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
31290 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
312a0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
312b0 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  text = pItem->zN
312c0 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ame;..    /* Gen
312d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
312e0 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
312f0 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20  uery.    **.    
31300 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
31310 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
31320 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  s a co-routine i
31330 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
31340 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74  s.    ** guarant
31350 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75  eed to be the ou
31360 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61  ter loop (so tha
31370 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  t it does not ne
31380 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ed to be.    ** 
31390 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68  computed more th
313a0 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a  an once).    **.
313b0 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65      ** TODO: Are
313c0 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65 61   there other rea
313d0 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29 20  sons beside (1) 
313e0 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74  to use a co-rout
313f0 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65  ine.    ** imple
31400 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a  mentation?.    *
31410 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20  /.    if( i==0. 
31420 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
31430 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
31440 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69        || (pTabLi
31450 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e  st->a[1].fg.join
31460 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54  type&(JT_LEFT|JT
31470 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a  _CROSS))!=0)  /*
31480 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20   (1) */.    ){. 
31490 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
314a0 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
314b0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
314c0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
314d0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
314e0 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
314f0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
31500 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
31510 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
31520 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
31530 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20 20  v)+1;.     .    
31540 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
31550 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
31560 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
31570 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
31580 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
31590 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
315a0 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
315b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
315c0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
315d0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
315e0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
315f0 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
31600 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
31610 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
31620 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
31630 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
31640 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
31650 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
31660 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
31670 43 4f 2d 52 4f 55 54 49 4e 45 20 30 78 25 70 22  CO-ROUTINE 0x%p"
31680 2c 20 70 53 75 62 29 29 3b 0a 20 20 20 20 20 20  , pSub));.      
31690 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
316a0 53 65 74 49 64 28 70 50 61 72 73 65 2c 20 70 53  SetId(pParse, pS
316b0 75 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ub);.      sqlit
316c0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
316d0 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
316e0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
316f0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
31700 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
31710 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
31720 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
31730 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
31740 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
31750 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
31760 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
31770 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e  utine(v, pItem->
31780 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
31790 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
317a0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
317b0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
317c0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
317d0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
317e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
317f0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
31800 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
31810 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
31820 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
31830 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
31840 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
31850 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
31860 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
31870 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
31880 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
31890 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
318a0 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
318b0 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
318c0 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
318d0 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
318e0 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
318f0 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
31900 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
31910 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
31920 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
31930 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
31940 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73  retAddr;.      s
31950 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
31960 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20  em *pPrior;..   
31970 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
31980 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
31990 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
319a0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
319b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
319c0 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
319d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
319e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
319f0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
31a00 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
31a10 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
31a20 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
31a30 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
31a40 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b  Correlated==0 ){
31a50 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
31a60 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
31a70 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  ot correlated an
31a80 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
31a90 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
31aa0 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
31ab0 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
31ac0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
31ad0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
31ae0 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
31af0 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
31b00 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
31b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
31b20 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
31b30 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
31b40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
31b50 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
31b60 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
31b70 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
31b80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31b90 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
31ba0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
31bb0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
31bc0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
31bd0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ame));.      }. 
31be0 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73       pPrior = is
31bf0 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61  SelfJoinView(pTa
31c00 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20  bList, pItem);. 
31c10 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
31c20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31c30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31c40 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65  OP_OpenDup, pIte
31c50 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69  m->iCursor, pPri
31c60 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  or->iCursor);.  
31c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
31c80 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30  rior->pSelect!=0
31c90 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62   );.        pSub
31ca0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
31cb0 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  Prior->pSelect->
31cc0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
31cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31ce0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
31cf0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
31d00 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
31d10 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
31d20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
31d30 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
31d40 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45 20 30  , "MATERIALIZE 0
31d50 78 25 70 22 2c 20 70 53 75 62 29 29 3b 0a 20 20  x%p", pSub));.  
31d60 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
31d70 72 79 50 6c 61 6e 53 65 74 49 64 28 70 50 61 72  ryPlanSetId(pPar
31d80 73 65 2c 70 53 75 62 29 3b 0a 20 20 20 20 20 20  se,pSub);.      
31d90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
31da0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
31db0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  est);.      }.  
31dc0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
31dd0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
31de0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
31df0 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
31e00 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
31e10 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
31e20 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
31e30 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
31e40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
31e50 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
31e60 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
31e70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
31e80 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
31e90 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
31ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31eb0 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
31ec0 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
31ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
31ee0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
31ef0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
31f00 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
31f10 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
31f20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50  lect_end;.    pP
31f30 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
31f40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
31f50 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
31f60 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
31f70 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
31f80 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69  thContext;.#endi
31f90 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69  f.  }..  /* Vari
31fa0 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ous elements of 
31fb0 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65  the SELECT copie
31fc0 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72  d into local var
31fd0 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20  iables for.  ** 
31fe0 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20  convenience */. 
31ff0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
32000 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  ist;.  pWhere = 
32010 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
32020 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
32030 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
32040 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
32050 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
32060 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
32070 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
32080 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
32090 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
320a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
320b0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
320c0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
320d0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
320e0 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  After all FROM-c
320f0 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c  lause analysis:\
32100 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
32110 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
32120 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
32130 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
32140 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
32150 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
32160 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
32170 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
32180 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
32190 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56  |SQLITE_CountOfV
321a0 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74  iew).   && count
321b0 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
321c0 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  on(pParse, p).  
321d0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  ){.    if( db->m
321e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
321f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
32200 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70     pEList = p->p
32210 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c  EList;.    pTabL
32220 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
32230 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
32240 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
32250 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
32260 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
32270 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
32280 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
32290 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
322a0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
322b0 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
322c0 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
322d0 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
322e0 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
322f0 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
32300 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
32310 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
32320 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
32330 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
32340 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
32350 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
32360 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
32370 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
32380 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
32390 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
323a0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
323b0 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
323c0 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
323d0 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
323e0 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
323f0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
32400 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
32410 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
32420 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
32430 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
32440 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
32450 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
32460 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
32470 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
32480 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
32490 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
324a0 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
324b0 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
324c0 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
324d0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
324e0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
324f0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
32500 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
32510 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
32520 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
32530 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c  rt.pOrderBy, pEL
32540 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
32550 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
32560 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
32570 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
32580 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
32590 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
325a0 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
325b0 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20  ;.    /* Notice 
325c0 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
325d0 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61  t SF_Distinct ha
325e0 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66  s been cleared f
325f0 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c  rom p->selFlags,
32600 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73  .    ** the sDis
32610 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20  tinct.isTnct is 
32620 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63  still set.  Henc
32630 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73  e, isTnct repres
32640 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ents the.    ** 
32650 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67  original setting
32660 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69   of the SF_Disti
32670 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68  nct flag, not th
32680 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
32690 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  g */.    assert(
326a0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
326b0 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  t );..#if SELECT
326c0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
326d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
326e0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
326f0 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   ){.      SELECT
32700 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
32710 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d  se,p,("Transform
32720 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47   DISTINCT into G
32730 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20  ROUP BY:\n"));. 
32740 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
32750 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
32760 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
32770 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  f.  }..  /* If t
32780 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
32790 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
327a0 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
327b0 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20  eral index to.  
327c0 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e  ** do the sortin
327d0 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72  g.  But this sor
327e0 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69  ting ephemeral i
327f0 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
32800 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75  p.  ** being unu
32810 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
32820 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
32830 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
32840 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rder..  ** If th
32850 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
32860 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e  then the OP_Open
32870 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
32880 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ction will be.  
32890 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  ** changed to an
328a0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65   OP_Noop once we
328b0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
328c0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
328d0 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e  ex is.  ** not n
328e0 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72  eeded.  The sSor
328f0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
32900 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
32910 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20   to facilitate. 
32920 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e   ** that change.
32930 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
32940 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
32950 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
32960 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
32970 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
32980 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
32990 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
329a0 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  0, pEList->nExpr
329b0 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43  );.    sSort.iEC
329c0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
329d0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72  nTab++;.    sSor
329e0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
329f0 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
32a00 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
32a10 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
32a20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
32a30 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
32a40 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
32a50 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  +pEList->nExpr, 
32a60 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  0,.          (ch
32a70 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
32a80 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29  _KEYINFO.      )
32a90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
32aa0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
32ab0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
32ac0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
32ad0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
32ae0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
32af0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
32b00 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
32b10 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
32b20 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
32b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32b40 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
32b50 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
32b60 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
32b70 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
32b80 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
32b90 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
32ba0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
32bb0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
32bc0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
32bd0 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d  SF_FixedLimit)==
32be0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  0 ){.    p->nSel
32bf0 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
32c00 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
32c10 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74   */.  }.  comput
32c20 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
32c30 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
32c40 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
32c50 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
32c60 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
32c70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
32c80 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
32c90 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
32ca0 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  ndex, OP_SorterO
32cb0 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  pen);.    sSort.
32cc0 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52  sortFlags |= SOR
32cd0 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b  TFLAG_UseSorter;
32ce0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
32cf0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
32d00 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
32d10 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
32d20 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
32d30 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
32d40 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73  inct ){.    sDis
32d50 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20  tinct.tabTnct = 
32d60 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
32d70 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64      sDistinct.ad
32d80 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33  drTnct = sqlite3
32d90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
32da0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
32dd0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
32de0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
32df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e00 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66     (char*)keyInf
32e10 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
32e20 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
32e30 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e50 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
32e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
32e70 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
32e80 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
32e90 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
32ea0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
32eb0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b  TINCT_UNORDERED;
32ec0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44  .  }else{.    sD
32ed0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
32ee0 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
32ef0 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  CT_NOOP;.  }..  
32f00 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
32f10 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
32f20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
32f30 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
32f40 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
32f50 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  e */.    u16 wct
32f60 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74  rlFlags = (sDist
32f70 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48  inct.isTnct ? WH
32f80 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
32f90 54 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  T : 0);.    asse
32fa0 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  rt( WHERE_USE_LI
32fb0 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d  MIT==SF_FixedLim
32fc0 69 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46  it );.    wctrlF
32fd0 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c  lags |= p->selFl
32fe0 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
32ff0 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  mit;..    /* Beg
33000 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
33010 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c  scan. */.    SEL
33020 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
33030 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e  e,p,("WhereBegin
33040 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66  \n"));.    pWInf
33050 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
33060 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
33070 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
33080 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
33090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
330b0 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
330c0 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74  lags, p->nSelect
330d0 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Row);.    if( pW
330e0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
330f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
33100 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
33110 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
33120 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
33130 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
33140 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
33150 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
33160 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
33170 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
33180 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
33190 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
331a0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
331b0 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
331c0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
331d0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
331e0 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
331f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
33200 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
33210 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
33220 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
33230 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
33240 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f  Info);.      sSo
33250 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  rt.bOrderedInner
33260 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68  Loop = sqlite3Wh
33270 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
33280 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  oop(pWInfo);.   
33290 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
332a0 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
332b0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
332c0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
332d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
332e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
332f0 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
33300 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
33310 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
33320 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
33330 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
33340 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
33350 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
33360 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
33370 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
33380 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
33390 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
333a0 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
333b0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
333c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
333d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
333e0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
333f0 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
33400 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
33410 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
33420 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
33430 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73  loop. */.    ass
33440 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d  ert( p->pEList==
33450 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65  pEList );.    se
33460 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
33470 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
33480 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
33490 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
334a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
334b0 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
334c0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
334d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334e0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
334f0 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
33500 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
33510 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
33520 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
33530 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
33540 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
33550 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
33560 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
33570 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
33580 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
33590 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
335a0 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
335b0 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
335c0 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
335d0 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
335e0 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
335f0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
33600 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
33610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
33620 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
33630 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
33640 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
33650 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
33660 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
33670 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
33680 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
33690 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
336a0 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
336b0 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
336c0 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
336d0 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
336e0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
336f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
33700 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
33710 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
33720 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
33730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33740 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
33750 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
33760 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
33770 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
33780 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
33790 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
337a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
337b0 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
337c0 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
337d0 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
337e0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
337f0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
33800 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
33810 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
33820 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
33830 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
33840 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
33850 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
33860 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
33870 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
33880 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
33890 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
338a0 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
338b0 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
338c0 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
338d0 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
338e0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
338f0 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
33900 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
33910 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
33920 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
33930 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
33940 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
33950 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
33960 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
33970 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
33980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33990 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
339a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
339b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
339c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
339d0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
339e0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
339f0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
33a00 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
33a10 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
33a20 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
33a30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
33a40 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
33a50 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
33a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
33a70 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
33a80 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
33a90 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
33aa0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
33ab0 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
33ac0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
33ad0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
33ae0 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
33af0 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20  st(100) );.     
33b00 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
33b10 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65  ow>66 ) p->nSele
33b20 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20  ctRow = 66;.    
33b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
33b40 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
33b50 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20  ogEst(1) );.    
33b60 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
33b70 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
33b80 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
33b90 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
33ba0 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
33bb0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
33bc0 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  re.    ** identi
33bd0 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  cal, then it may
33be0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
33bf0 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
33c00 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20  R BY clause .   
33c10 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e   ** on the groun
33c20 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  ds that the GROU
33c30 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20  P BY will cause 
33c40 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
33c50 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20   out .    ** in 
33c60 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
33c70 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e  r. It also may n
33c80 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42  ot - the GROUP B
33c90 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20  Y might use a.  
33ca0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
33cb0 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
33cc0 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
33cd0 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
33ce0 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
33cf0 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
33d00 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
33d10 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
33d20 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
33d30 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
33d40 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
33d50 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
33d60 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
33d70 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
33d80 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
33d90 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
33da0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
33db0 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
33dc0 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
33dd0 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
33de0 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
33df0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
33e00 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
33e10 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
33e20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
33e30 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
33e40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
33e50 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
33e60 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
33e70 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
33e80 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
33e90 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
33ea0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
33eb0 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
33ec0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
33ed0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
33ee0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
33ef0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
33f00 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
33f10 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
33f20 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
33f30 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
33f40 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
33f50 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
33f60 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66   sNC.uNC.pAggInf
33f70 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
33f80 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43     VVA_ONLY( sNC
33f90 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41  .ncFlags = NC_UA
33fa0 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41  ggInfo; ).    sA
33fb0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70  ggInfo.mnReg = p
33fc0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
33fd0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
33fe0 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
33ff0 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
34000 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
34010 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
34020 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
34030 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
34040 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
34050 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
34060 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
34070 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
34080 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b  sSort.pOrderBy);
34090 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
340a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47   ){.      if( pG
340b0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
340c0 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65    assert( pWhere
340d0 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20  ==p->pWhere );. 
340e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
340f0 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69  Having==p->pHavi
34100 6e 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ng );.        as
34110 73 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d  sert( pGroupBy==
34120 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  p->pGroupBy );. 
34130 20 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57         havingToW
34140 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b  here(pParse, p);
34150 0a 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20  .        pWhere 
34160 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
34170 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
34180 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
34190 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
341a0 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
341b0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
341c0 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
341d0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
341e0 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  if( p->pGroupBy=
341f0 3d 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67  =0 && p->pHaving
34200 3d 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e  ==0 && sAggInfo.
34210 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20  nFunc==1 ){.    
34220 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d    minMaxFlag = m
34230 69 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73  inMaxQuery(db, s
34240 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
34250 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78  .pExpr, &pMinMax
34260 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65  OrderBy);.    }e
34270 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61  lse{.      minMa
34280 78 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52  xFlag = WHERE_OR
34290 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
342a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
342b0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
342c0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
342d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
342e0 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
342f0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
34300 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
34310 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
34320 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46  ags |= NC_InAggF
34330 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
34340 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
34350 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
34360 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
34370 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
34380 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
34390 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63  &= ~NC_InAggFunc
343a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
343b0 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61  Info.mxReg = pPa
343c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
343d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
343e0 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
343f0 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43  t_end;.#if SELEC
34400 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
34410 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
34420 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
34430 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
34440 69 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  i;.      SELECTT
34450 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
34460 65 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72  e,p,("After aggr
34470 65 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c  egate analysis:\
34480 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
34490 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
344a0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
344b0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
344c0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
344d0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
344e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
344f0 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25  tf("agg-column[%
34500 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20  d] iMem=%d\n",. 
34510 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73             ii, s
34520 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d  AggInfo.aCol[ii]
34530 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
34540 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
34550 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e  xpr(0, sAggInfo.
34560 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20  aCol[ii].pExpr, 
34570 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
34580 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
34590 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
345a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
345b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
345c0 28 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20  ("agg-func[%d]: 
345d0 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  iMem=%d\n",.    
345e0 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67          ii, sAgg
345f0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69  Info.aFunc[ii].i
34600 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
34610 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
34620 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  r(0, sAggInfo.aF
34630 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  unc[ii].pExpr, 0
34640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34650 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a  .#endif...    /*
34660 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
34670 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
34680 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
34690 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
346a0 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
346b0 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
346c0 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
346d0 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
346e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
346f0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
34700 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
34710 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
34720 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
34730 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
34740 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
34750 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1;          /* A
34760 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
34770 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
34780 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
34790 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
347a0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
347b0 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
347c0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
347d0 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
347e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
347f0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
34800 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
34810 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
34820 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
34830 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
34840 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
34850 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
34860 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
34870 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
34880 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
34890 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
348a0 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
348b0 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
348c0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
348d0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
348e0 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
348f0 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
34900 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
34910 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
34920 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
34930 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
34940 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
34950 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
34960 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
34970 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
34980 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
34990 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
349a0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
349b0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
349c0 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
349d0 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
349e0 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
349f0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
34a00 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
34a10 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
34a20 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f  ter all, the OP_
34a30 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72  SorterOpen instr
34a40 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
34a50 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
34a60 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
34a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34a80 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
34a90 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
34aa0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
34ab0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
34ac0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
34ad0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  e, pGroupBy, 0, 
34ae0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
34af0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
34b00 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
34b10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
34b20 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
34b30 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
34b40 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
34b50 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
34b60 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
34b70 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
34b80 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
34b90 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
34ba0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
34bb0 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
34bc0 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
34bd0 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
34be0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
34bf0 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
34c00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
34c10 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
34c20 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
34c30 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
34c40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
34c50 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
34c60 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
34c70 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
34c80 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
34c90 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
34ca0 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
34cb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
34cc0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
34cd0 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
34ce0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
34cf0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
34d00 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
34d10 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
34d20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
34d30 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
34d40 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
34d50 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
34d60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34d70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
34d80 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
34d90 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
34da0 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
34db0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
34dc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34dd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
34de0 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
34df0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34e00 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
34e10 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
34e20 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
34e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
34e40 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
34e50 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
34e60 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
34e70 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
34e80 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
34e90 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
34ea0 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
34eb0 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
34ec0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
34ed0 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
34ee0 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
34ef0 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
34f00 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
34f10 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
34f20 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
34f30 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
34f40 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
34f50 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
34f60 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
34f70 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
34f80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34f90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34fa0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
34fb0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
34fc0 73 65 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  set);.      SELE
34fd0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
34fe0 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c  ,p,("WhereBegin\
34ff0 6e 22 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  n"));.      pWIn
35000 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
35010 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
35020 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
35030 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20   pGroupBy, 0,.  
35040 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52          WHERE_GR
35050 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79  OUPBY | (orderBy
35060 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54  Grp ? WHERE_SORT
35070 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a  BYGROUP : 0), 0.
35080 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
35090 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
350a0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
350b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
350c0 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
350d0 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42  pWInfo)==pGroupB
350e0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
350f0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
35100 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
35110 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
35120 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
35130 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
35140 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
35150 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
35160 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
35170 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
35180 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
35190 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
351a0 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
351b0 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
351c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
351d0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
351e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
351f0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
35200 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
35210 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
35220 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
35230 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
35240 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
35250 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
35260 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
35270 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
35280 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
35290 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
352a0 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
352b0 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
352c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
352d0 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
352e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
352f0 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
35300 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
35310 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
35320 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
35330 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
35340 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
35350 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
35360 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74            (sDist
35370 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28  inct.isTnct && (
35380 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
35390 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20  istinct)==0) ?. 
353a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353b0 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20     "DISTINCT" : 
353c0 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20  "GROUP BY");..  
353d0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
353e0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
353f0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
35400 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
35410 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
35420 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  By;.        j = 
35430 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
35440 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
35450 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
35460 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
35470 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
35480 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
35490 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
354a0 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
354b0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
354c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
354d0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
354e0 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
354f0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
35500 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
35510 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
35520 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
35530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
35540 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
35550 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
35560 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b   regBase, 0, 0);
35570 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
35580 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
35590 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
355a0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
355b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
355c0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
355d0 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
355e0 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
355f0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
35600 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
35610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
35620 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
35630 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
35640 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
35650 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50  etColumnToReg(pP
35660 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
35670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35680 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
35690 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
356a0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
356b0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
356c0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
356d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
356e0 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
356f0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
35700 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
35710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35720 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
35730 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
35740 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
35750 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35760 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35770 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
35780 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
35790 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
357a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
357b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
357c0 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
357d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
357e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
357f0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
35800 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
35810 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
35820 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
35830 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
35840 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
35850 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
35860 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
35870 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
35880 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
35890 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
358a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
358b0 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
358c0 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
358d0 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
358e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
358f0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
35900 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
35910 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
35920 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
35930 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
35940 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
35950 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
35960 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
35970 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
35980 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
35990 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
359a0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ear(pParse);..  
359b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
359c0 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20  If the index or 
359d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
359e0 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55  used by the GROU
359f0 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20  P BY sort.      
35a00 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c  ** will naturall
35a10 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  y deliver rows i
35a20 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75  n the order requ
35a30 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ired by the ORDE
35a40 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c  R BY.      ** cl
35a50 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65  ause, cancel the
35a60 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
35a70 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c   open coded earl
35a80 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ier..      **.  
35a90 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
35aa0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
35ab0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
35ac0 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
35ad0 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
35ae0 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53      ** Use the S
35af0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
35b00 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
35b10 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
35b20 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20  IMIZER to .     
35b30 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73   ** disable this
35b40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
35b50 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
35b60 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  es.  */.      if
35b70 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20  ( orderByGrp && 
35b80 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
35b90 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
35ba0 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20  roupByOrder) .  
35bb0 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79       && (groupBy
35bc0 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57  Sort || sqlite3W
35bd0 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49  hereIsSorted(pWI
35be0 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  nfo)).      ){. 
35bf0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
35c00 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
35c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
35c20 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
35c30 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
35c40 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
35c50 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
35c60 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
35c70 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
35c80 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
35c90 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
35ca0 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
35cb0 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
35cc0 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
35cd0 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
35ce0 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
35cf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
35d00 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
35d10 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
35d20 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
35d30 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
35d40 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
35d50 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
35d60 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
35d70 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
35d80 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
35d90 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
35da0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
35db0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
35dc0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
35dd0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
35de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
35df0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
35e00 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
35e10 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
35e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35e30 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f             sortO
35e40 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20  ut, sortPTab);. 
35e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
35e60 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
35e70 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
35e80 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
35e90 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
35ea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35eb0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
35ec0 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c  mn, sortPTab, j,
35ed0 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
35ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35ef0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
35f00 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
35f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
35f20 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
35f30 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
35f40 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
35f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35f70 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
35f80 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
35f90 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
35fa0 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
35fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fc0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
35fd0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
35fe0 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
35ff0 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
36000 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
36010 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
36020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36030 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
36040 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31  ddr1+1, 0, addr1
36050 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
36060 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e(v);..      /* 
36070 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
36080 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
36090 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
360a0 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
360b0 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47  Changes in the G
360c0 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
360d0 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
360e0 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
360f0 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
36100 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
36110 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
36120 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
36130 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
36140 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
36150 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
36160 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
36170 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
36180 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
36190 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
361a0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
361b0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
361c0 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
361d0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
361e0 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
361f0 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
36200 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
36210 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
36220 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
36230 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
36240 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42  eMove(pParse, iB
36250 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f  Mem, iAMem, pGro
36260 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  upBy->nExpr);.  
36270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
36280 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
36290 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
362a0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
362b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
362c0 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f  nt((v, "output o
362d0 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
362e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
362f0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
36300 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
36310 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  End); VdbeCovera
36320 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
36330 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68  eComment((v, "ch
36340 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
36350 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36360 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
36370 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
36380 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
36390 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
363a0 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
363b0 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
363c0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
363d0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
363e0 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
363f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
36400 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
36410 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
36420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36430 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
36440 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61  dr1);.      upda
36450 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
36460 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
36470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36480 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
36490 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
364a0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
364b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
364c0 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
364d0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
364e0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
364f0 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
36500 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
36510 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
36520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36530 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
36540 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
36550 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
36560 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
36570 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
36580 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
36590 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
365a0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
365b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
365c0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
365d0 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
365e0 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gIdx);.      }..
365f0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
36600 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
36610 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
36620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36630 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
36640 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
36650 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
36660 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
36670 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
36680 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
36690 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
366a0 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
366b0 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
366c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
366d0 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  to(v, addrEnd);.
366e0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
366f0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
36700 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
36710 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
36720 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
36730 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
36740 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
36750 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
36760 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
36770 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
36780 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
36790 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
367a0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
367b0 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
367c0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
367d0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
367e0 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
367f0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
36800 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
36810 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
36820 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
36830 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
36840 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
36850 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
36860 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
36870 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
36880 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
36890 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
368a0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
368b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
368c0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
368d0 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
368e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
368f0 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
36900 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
36910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36920 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
36930 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
36940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36950 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36960 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
36970 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
36980 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
36990 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
369a0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
369b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
369c0 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
369d0 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
369e0 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
369f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
36a00 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36a10 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
36a20 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
36a30 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
36a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36a50 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
36a60 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
36a70 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
36a80 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
36a90 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
36aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
36ab0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
36ac0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
36ad0 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
36ae0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
36af0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
36b00 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
36b10 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20  -1, &sSort,.    
36b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b30 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44    &sDistinct, pD
36b40 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
36b50 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
36b60 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
36b70 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
36b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36b90 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
36ba0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
36bb0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36bc0 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
36bd0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
36be0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
36bf0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
36c00 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
36c10 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
36c20 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
36c30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36c40 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
36c50 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
36c60 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
36c70 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
36c80 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
36c90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36ca0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
36cb0 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
36cc0 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
36cd0 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
36ce0 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
36cf0 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
36d00 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
36d10 20 20 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64      else {.#ifnd
36d20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
36d30 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
36d40 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
36d50 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69     if( (pTab = i
36d60 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20  sSimpleCount(p, 
36d70 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29  &sAggInfo))!=0 )
36d80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
36d90 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20  isSimpleCount() 
36da0 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
36db0 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  r to a Table str
36dc0 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20  ucture, then.   
36dd0 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20       ** the SQL 
36de0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
36df0 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20  the form:.      
36e00 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
36e10 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
36e20 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20  ) FROM <tbl>.   
36e30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
36e40 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62  ** where the Tab
36e50 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  le structure ret
36e60 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73  urned represents
36e70 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20   table <tbl>..  
36e80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
36e90 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   ** This stateme
36ea0 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20  nt is so common 
36eb0 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d  that it is optim
36ec0 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20  ized specially. 
36ed0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  The.        ** O
36ee0 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74  P_Count instruct
36ef0 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20  ion is executed 
36f00 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e  either on the in
36f10 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a  tkey table that.
36f20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
36f30 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72  ins the data for
36f40 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20   table <tbl> or 
36f50 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e  on one of its in
36f60 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20  dexes. It.      
36f70 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74    ** is better t
36f80 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70  o execute the op
36f90 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73   on an index, as
36fa0 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d   indexes are alm
36fb0 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ost.        ** a
36fc0 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72  lways spread acr
36fd0 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74  oss less pages t
36fe0 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73  han their corres
36ff0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a  ponding tables..
37000 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37010 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62     const int iDb
37020 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
37030 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
37040 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
37050 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  a);.        cons
37060 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61  t int iCsr = pPa
37070 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
37080 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
37090 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  an b-tree */.   
370a0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
370b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
370c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
370d0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
370e0 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  /.        KeyInf
370f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
37100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37110 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63  * Keyinfo for sc
37120 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  anned index */. 
37130 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42         Index *pB
37140 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
37150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
37160 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20  est index found 
37170 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
37180 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54    int iRoot = pT
37190 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20  ab->tnum;       
371a0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
371b0 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62  age of scanned b
371c0 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20  -tree */..      
371d0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
371e0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
371f0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
37200 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
37210 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
37220 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
37230 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
37240 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
37250 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  r the index that
37260 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20   has the lowest 
37270 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20  scan cost..     
37280 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
37290 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f   (2011-04-15) Do
372a0 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73   not do a full s
372b0 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65  can of an unorde
372c0 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  red index..     
372d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
372e0 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f   (2013-10-03) Do
372f0 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65   not count the e
37300 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74  ntries in a part
37310 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ial index..     
37320 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
37330 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65   In practice the
37340 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
37350 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  re will not be u
37360 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  sed. It is only 
37370 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73  .        ** pass
37380 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70  ed to keep OP_Op
37390 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20  enRead happy..  
373a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
373b0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
373c0 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73  Tab) ) pBest = s
373d0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
373e0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
373f0 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
37400 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
37410 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
37420 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  xt){.          i
37430 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65  f( pIdx->bUnorde
37440 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
37450 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78    && pIdx->szIdx
37460 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
37470 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ow.           &&
37480 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
37490 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  here==0.        
374a0 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c     && (!pBest ||
374b0 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
374c0 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29  pBest->szIdxRow)
374d0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
374e0 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20            pBest 
374f0 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
37500 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
37510 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20        if( pBest 
37520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  ){.          iRo
37530 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d  ot = pBest->tnum
37540 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
37550 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
37560 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
37570 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  rse, pBest);.   
37580 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
37590 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
375a0 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63  nly cursor, exec
375b0 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74  ute the OP_Count
375c0 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73  , close the curs
375d0 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  or. */.        s
375e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
375f0 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Int(v, OP_OpenRe
37600 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c  ad, iCsr, iRoot,
37610 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20   iDb, 1);.      
37620 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
37630 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
37640 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
37650 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70  v, -1, (char *)p
37660 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
37670 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NFO);.        }.
37680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37690 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
376a0 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67  Count, iCsr, sAg
376b0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69  gInfo.aFunc[0].i
376c0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
376d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
376e0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73  v, OP_Close, iCs
376f0 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  r);.        expl
37700 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70  ainSimpleCount(p
37710 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65  Parse, pTab, pBe
37720 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
37730 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
37740 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
37750 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  T */.      {.   
37760 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
37770 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
37780 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
37790 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
377a0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
377b0 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
377c0 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
377d0 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
377e0 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
377f0 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
37800 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
37810 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
37820 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
37830 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
37840 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
37850 26 73 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20  &sAggInfo);..   
37860 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
37870 71 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69  query is a candi
37880 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e  date for the min
37890 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f  /max optimizatio
378a0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  n, then.        
378b0 2a 2a 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69  ** minMaxFlag wi
378c0 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ll have been pre
378d0 76 69 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65  viously set to e
378e0 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  ither.        **
378f0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
37900 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
37910 52 42 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e  RBY_MAX and pMin
37920 4d 61 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a  MaxOrderBy will.
37930 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e          ** be an
37940 20 61 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44   appropriate ORD
37950 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
37960 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
37970 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ation..        *
37980 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
37990 28 20 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48  ( minMaxFlag==WH
379a0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
379b0 41 4c 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64  AL || pMinMaxOrd
379c0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20  erBy!=0 );.     
379d0 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
379e0 61 78 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  axOrderBy==0 || 
379f0 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e  pMinMaxOrderBy->
37a00 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20  nExpr==1 );..   
37a10 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
37a20 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68  (1,pParse,p,("Wh
37a30 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20  ereBegin\n"));. 
37a40 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
37a50 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
37a60 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
37a70 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e  st, pWhere, pMin
37a80 4d 61 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  MaxOrderBy,.    
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
37ab0 2c 20 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29  , minMaxFlag, 0)
37ac0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
37ad0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
37ae0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
37af0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
37b00 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
37b10 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
37b20 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
37b30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
37b40 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
37b50 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20  pWInfo)>0 ){.   
37b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37b70 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65  beGoto(v, sqlite
37b80 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
37b90 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  (pWInfo));.     
37ba0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
37bb0 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e  ((v, "%s() by in
37bc0 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  dex",.          
37bd0 20 20 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61        (minMaxFla
37be0 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
37bf0 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
37c00 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
37c10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
37c20 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
37c30 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
37c40 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
37c50 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
37c60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
37c70 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
37c80 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
37c90 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
37ca0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
37cb0 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
37cc0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
37cd0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
37ce0 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20  (pParse, p, -1, 
37cf0 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
37d00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
37d10 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
37d20 72 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rEnd);.    }.   
37d30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
37d40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
37d50 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
37d60 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
37d70 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
37d80 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
37d90 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
37da0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
37db0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
37dc0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
37dd0 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
37de0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
37df0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
37e00 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
37e10 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
37e20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
37e30 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
37e40 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
37e50 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
37e60 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
37e70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
37e80 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
37e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37ea0 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
37eb0 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41  at>0 ? "RIGHT PA
37ec0 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a  RT OF ORDER BY":
37ed0 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20  "ORDER BY");.   
37ee0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
37ef0 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 20 20  st==pEList );.  
37f00 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
37f10 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73  il(pParse, p, &s
37f20 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Sort, pEList->nE
37f30 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
37f40 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
37f50 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
37f60 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
37f70 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
37f80 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
37f90 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61  /* The SELECT ha
37fa0 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66  s been coded. If
37fb0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
37fc0 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
37fd0 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20  structure,.  ** 
37fe0 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
37ff0 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77  ode to 1. Otherw
38000 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d  ise 0. */.  rc =
38010 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30   (pParse->nErr>0
38020 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  );..  /* Control
38030 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
38040 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
38050 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
38060 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
38070 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
38080 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
38090 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
380a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
380b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4d 69 6e  tDelete(db, pMin
380c0 4d 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  MaxOrderBy);.  s
380d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
380e0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
380f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
38100 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
38110 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  unc);.#if SELECT
38120 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
38130 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c  SELECTTRACE(0x1,
38140 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
38150 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
38160 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53 65    if( (sqlite3Se
38170 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 32 30  lectTrace & 0x20
38180 30 30 29 21 3d 30 20 26 26 20 45 78 70 6c 61 69  00)!=0 && Explai
38190 6e 51 75 65 72 79 50 6c 61 6e 50 61 72 65 6e 74  nQueryPlanParent
381a0 28 70 50 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20  (pParse)==0 ){. 
381b0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
381c0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
381d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
381e0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
381f0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Pop(pParse);.  r
38200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.