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

Artifact 3ba9808f63c7e8e23903b85008f84df15d86da68730840521cbf04dec2f89883:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%s/%d/%p: ",(S)
02c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28 50 29 2d 3e  ->zSelName,(P)->
02d0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 28 53 29 29  addrExplain,(S))
02e0: 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ,\.    sqlite3De
02f0: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0300: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43  e.# define SELEC
0310: 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a  TTRACE(K,P,S,X).
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
0330: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0350: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0360: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0370: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
0380: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
0390: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
03a0: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
03b0: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
03c0: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
03d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
03e0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
03f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
0400: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
0410: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
0420: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
0430: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
0440: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
0450: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0460: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
0470: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
0480: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
0490: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
04a0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
04b0: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
04c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
04d0: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
04e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
04f0: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
0500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
0510: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
0520: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
0530: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
0540: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0560: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0570: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0580: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52   about.** the OR
0590: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
05a0: 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71   BY) clause of q
05b0: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f  uery is being co
05c0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ded..**.** The a
05d0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
05e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72   used by the sor
05f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f  ter-references o
0600: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72  ptimization. For
0610: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
0620: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
0630: 6f 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  o index that can
0640: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0650: 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f   ORDER BY,.** fo
0660: 72 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  r the query:.**.
0670: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c  **     SELECT a,
0680: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
0690: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
06a0: 54 20 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d  T 10;.**.** it m
06b0: 61 79 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  ay be more effic
06c0: 69 65 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74  ient to add just
06d0: 20 74 68 65 20 22 61 22 20 76 61 6c 75 65 73 20   the "a" values 
06e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61  to the sorter, a
06f0: 6e 64 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  nd.** retrieve t
0700: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 62  he associated "b
0710: 69 67 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64  igblob" values d
0720: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
0730: 6c 65 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20  le t1 as the.** 
0740: 31 30 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20  10 smallest "a" 
0750: 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
0760: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f  cted from the so
0770: 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rter..**.** When
0780: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
0790: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
07a0: 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 65 72  on is used, ther
07b0: 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69  e is one entry i
07c0: 6e 20 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b  n the.** aDefer[
07d0: 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68  ] array for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
07f0: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 61 64  that may be read
0800: 20 61 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   as values are.*
0810: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
0820: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
0830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0840: 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a  ortCtx SortCtx;.
0850: 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b  struct SortCtx {
0860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0870: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
0880: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0890: 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f  UP BY clause) */
08a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20  .  int nOBSat;  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08c0: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
08d0: 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
08e0: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  y indices */.  i
08f0: 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20  nt iECursor;    
0900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0910: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f  umber for the so
0920: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rter */.  int re
0930: 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20  gReturn;        
0940: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
0950: 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74  ing block-output
0960: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
0970: 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b  */.  int labelBk
0980: 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  Out;       /* St
0990: 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  art label for th
09a0: 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73  e block-output s
09b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
09c0: 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
09d0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
09e0: 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  of the OP_Sorter
09f0: 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45  Open or OP_OpenE
0a00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e  phemeral */.  in
0a10: 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  t labelDone;    
0a20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0a30: 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20   when done, ex: 
0a40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f  LIMIT reached */
0a50: 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b  .  u8 sortFlags;
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
0a70: 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41   or more SORTFLA
0a80: 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38  G_* bits */.  u8
0a90: 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f   bOrderedInnerLo
0aa0: 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  op; /* ORDER BY 
0ab0: 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20  correctly sorts 
0ac0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
0ad0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0ae0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
0af0: 46 45 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44  FERENCES.  u8 nD
0b00: 65 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  efer;           
0b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
0b20: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
0b30: 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72  Defer[] */.  str
0b40: 75 63 74 20 44 65 66 65 72 72 65 64 43 73 72 20  uct DeferredCsr 
0b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
0b60: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  b;        /* Tab
0b70: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  le definition */
0b80: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20  .    int iCsr;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0ba0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
0bb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
0bc0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Key;           /
0bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  * Number of PK c
0be0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65  olumns for table
0bf0: 20 70 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20   pTab (>=1) */. 
0c00: 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65   } aDefer[4];.#e
0c10: 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 52 6f  ndif.  struct Ro
0c20: 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44 65 66 65  wLoadInfo *pDefe
0c30: 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a  rredRowLoad;  /*
0c40: 20 44 65 66 65 72 72 65 64 20 72 6f 77 20 6c 6f   Deferred row lo
0c50: 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55  ading info or NU
0c60: 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  LL */.};.#define
0c70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0c80: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0c90: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0ca0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0cb0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0cc0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0cd0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0ce0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
0cf0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
0d00: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0d10: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0d20: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0d30: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0d40: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0d50: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0d60: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0d70: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0d80: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0d90: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0da0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0db0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
0dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0dd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0de0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
0df0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0e00: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0e10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e30: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0e50: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e70: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e80: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0e90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0ea0: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0eb0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ec0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ed0: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0ee0: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0ef0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0f00: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0f10: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0f20: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0f30: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0f40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0f50: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0f60: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0f70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0f80: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0f90: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0fa0: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0fb0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0fc0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0fd0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0fe0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0ff0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
1000: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
1010: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
1020: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
1030: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1040: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
1050: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
1060: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1070: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
1080: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
1090: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
10a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10e0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
10f0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
1100: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
1110: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1120: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
1130: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
1140: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
1150: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
1160: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
1170: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
1180: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
1190: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
11a0: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
11b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11c0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
11d0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
11e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11f0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1200: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
1210: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
1220: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
1230: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
1240: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
1250: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
1260: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
1270: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
1280: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
1290: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
12a0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
12b0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
12c0: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
12d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
12e0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
12f0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1300: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1310: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1320: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1330: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
1340: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
1350: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
1360: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
1370: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1380: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13c0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
13d0: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
13e0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
13f0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
1400: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1410: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1420: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1430: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
1440: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
1450: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
1460: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1470: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1480: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1490: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
14a0: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
14b0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
14c0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
14d0: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
14e0: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
14f0: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
1500: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1510: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1520: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1530: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
1540: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1550: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
1560: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
1570: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1580: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1590: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
15a0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
15b0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
15c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
15d0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
15e0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15f0: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
1600: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20  .  pNew->pWin = 
1610: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
1620: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1630: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
1640: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
1650: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1660: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1670: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1680: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1690: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
16a0: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
16c0: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
16d0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
16e0: 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
16f0: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
1700: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  et the name of a
1710: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a   Select object.*
1720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1730: 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65  lectSetName(Sele
1740: 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ct *p, const cha
1750: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
1760: 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20   p && zName ){. 
1770: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1780: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  ntf(sizeof(p->zS
1790: 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c  elName), p->zSel
17a0: 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d  Name, "%s", zNam
17b0: 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
17c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
17d0: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
17e0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
17f0: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
1800: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
1810: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1820: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1830: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1840: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
1850: 5f 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72  _TRUE(p) ) clear
1860: 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29  Select(db, p, 1)
1870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1880: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1890: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
18a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
18b0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f  n a compound..*/
18c0: 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
18d0: 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65  findRightmost(Se
18e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  lect *p){.  whil
18f0: 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20  e( p->pNext ) p 
1900: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  = p->pNext;.  re
1910: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1920: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
1930: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64  entifiers preced
1940: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
1950: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
1960: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
1970: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
1980: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
1990: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
19a0: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
19b0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
19c0: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
19d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
19e0: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
19f0: 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f  CROSS.**     JT_
1a00: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
1a10: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
1a20: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
1a30: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
1a40: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
1a50: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
1a60: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
1a70: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
1a80: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
1a90: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
1aa0: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
1ab0: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
1ac0: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
1ad0: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
1ae0: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
1af0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1b00: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  int sqlite3JoinT
1b10: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
1b20: 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f  e, Token *pA, To
1b30: 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a  ken *pB, Token *
1b40: 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74  pC){.  int joint
1b50: 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e  ype = 0;.  Token
1b60: 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f   *apAll[3];.  To
1b70: 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  ken *p;.        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35       /*   012345
1ba0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1bb0: 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a  23456789 123 */.
1bc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1bd0: 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d  har zKeyText[] =
1be0: 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65   "naturaleftoute
1bf0: 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72  rightfullinnercr
1c00: 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63  oss";.  static c
1c10: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1c20: 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f    u8 i;        /
1c30: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b  * Beginning of k
1c40: 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a  eyword text in z
1c50: 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20  KeyText[] */.   
1c60: 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a   u8 nChar;    /*
1c70: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b   Length of the k
1c80: 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63  eyword in charac
1c90: 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63  ters */.    u8 c
1ca0: 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e  ode;     /* Join
1cb0: 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20   type mask */.  
1cc0: 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b  } aKeyword[] = {
1cd0: 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20  .    /* natural 
1ce0: 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e  */ { 0,  7, JT_N
1cf0: 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20  ATURAL          
1d00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1d10: 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20  left    */ { 6, 
1d20: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
1d30: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c  UTER          },
1d40: 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20  .    /* outer   
1d50: 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f  */ { 10, 5, JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  UTER            
1d70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1d80: 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c  right   */ { 14,
1d90: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
1da0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c  OUTER         },
1db0: 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20  .    /* full    
1dc0: 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c  */ { 19, 4, JT_L
1dd0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
1de0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20  OUTER },.    /* 
1df0: 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c  inner   */ { 23,
1e00: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20   5, JT_INNER    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1e20: 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20  .    /* cross   
1e30: 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49  */ { 28, 5, JT_I
1e40: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20  NNER|JT_CROSS   
1e50: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
1e60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
1e70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
1e80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
1e90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
1ea0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
1eb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1ec0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1ed0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1ee0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ef0: 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rd); j++){.     
1f00: 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77   if( p->n==aKeyw
1f10: 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  ord[j].nChar .  
1f20: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1f30: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
1f40: 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78  *)p->z, &zKeyTex
1f50: 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d  t[aKeyword[j].i]
1f60: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
1f70: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1f80: 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f  = aKeyword[j].co
1f90: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1fa0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a  .    testcase( j
1fc0: 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a  ==0 || j==1 || j
1fd0: 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a  ==2 || j==3 || j
1fe0: 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a  ==4 || j==5 || j
1ff0: 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ==6 );.    if( j
2000: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  >=ArraySize(aKey
2010: 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a  word) ){.      j
2020: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
2030: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
2040: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2050: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
2060: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
2070: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
2080: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
2090: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
20a0: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
20b0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
20c0: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
20d0: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
20e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
20f0: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
2100: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2110: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
2120: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
2130: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
2140: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
2150: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
2160: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
2170: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
2180: 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79  else if( (jointy
2190: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
21a0: 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0 .         && (
21b0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
21c0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d  EFT|JT_RIGHT))!=
21d0: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73  JT_LEFT ){.    s
21e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21f0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
2200: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
2210: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
2220: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
2230: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
2240: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
2250: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
2260: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
2270: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
2280: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
2290: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
22a0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
22b0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
22c0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
22d0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
22e0: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
22f0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
2300: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
2310: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2320: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
2330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2340: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2350: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
2360: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
2370: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
2380: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
2390: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69  ** Search the fi
23a0: 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20  rst N tables in 
23b0: 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20  pSrc, from left 
23c0: 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e  to right, lookin
23d0: 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  g for a.** table
23e0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75   that has a colu
23f0: 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20  mn named zCol.  
2400: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e  .**.** When foun
2410: 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e  d, set *piTab an
2420: 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20  d *piCol to the 
2430: 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20  table index and 
2440: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20  column index.** 
2450: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
2460: 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72  column and retur
2470: 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  n TRUE..**.** If
2480: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
2490: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
24a0: 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64  tic int tableAnd
24b0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53  ColumnIndex(.  S
24c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
24d0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
24e0: 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68  tables to search
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
2500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2510: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2520: 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73  n pSrc->a[] to s
2530: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
2540: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
2550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2560: 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f  olumn we are loo
2570: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
2580: 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20  t *piTab,       
2590: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
25a0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68  x of pSrc->a[] h
25b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ere */.  int *pi
25c0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Col           /*
25d0: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
25e0: 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e  pSrc->a[*piTab].
25f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72  pTab->aCol[] her
2600: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2620: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2630: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  er tables in pSr
2640: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  c */.  int iCol;
2650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2660: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d  ndex of column m
2670: 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a  atching zCol */.
2680: 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61  .  assert( (piTa
2690: 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30  b==0)==(piCol==0
26a0: 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ) );  /* Both or
26b0: 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c   neither are NUL
26c0: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
26d0: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<N; i++){.    i
26e0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
26f0: 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  x(pSrc->a[i].pTa
2700: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b, zCol);.    if
2710: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
2720: 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a     if( piTab ){.
2730: 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d          *piTab =
2740: 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43   i;.        *piC
2750: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
2760: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2770: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
2780: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2790: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27a0: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74  is used to add t
27b0: 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20  erms implied by 
27c0: 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74  JOIN syntax to t
27d0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
27e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  se expression of
27f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2800: 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72  ent. The new ter
2810: 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41  m, which.** is A
2820: 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78  NDed with the ex
2830: 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61  isting WHERE cla
2840: 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66  use, is of the f
2850: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74  orm:.**.**    (t
2860: 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e  ab1.col1 = tab2.
2870: 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72  col2).**.** wher
2880: 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53  e tab1 is the iS
2890: 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53  rc'th table in S
28a0: 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20  rcList pSrc and 
28b0: 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20  tab2 is the .** 
28c0: 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c  (iSrc+1)'th. Col
28d0: 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75  umn col1 is colu
28e0: 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74  mn iColLeft of t
28f0: 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73  ab1, and col2 is
2900: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52  .** column iColR
2910: 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f  ight of tab2..*/
2920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
2930: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
2940: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2960: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2970: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
2980: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
2990: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
29a0: 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63  tables in FROM c
29b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
29c0: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29e0: 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62  dex of first tab
29f0: 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53  le to join in pS
2a00: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
2a10: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2a20: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a30: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69   of column in fi
2a40: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  rst table */.  i
2a50: 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20  nt iRight,      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a70: 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e  * Index of secon
2a80: 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20  d table in pSrc 
2a90: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67  */.  int iColRig
2aa0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2ab0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2ac0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e   column in secon
2ad0: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  d table */.  int
2ae0: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20   isOuterJoin,   
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b00: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2b10: 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f  an OUTER join */
2b20: 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2b30: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2b40: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68     /* IN/OUT: Th
2b50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2b60: 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  o add to */.){. 
2b70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2b80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
2b90: 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a  r *pE1;.  Expr *
2ba0: 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71  pE2;.  Expr *pEq
2bb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ;..  assert( iLe
2bc0: 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61  ft<iRight );.  a
2bd0: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72  ssert( pSrc->nSr
2be0: 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  c>iRight );.  as
2bf0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c  sert( pSrc->a[iL
2c00: 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61  eft].pTab );.  a
2c10: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
2c20: 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a  Right].pTab );..
2c30: 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43    pE1 = sqlite3C
2c40: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2c50: 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  db, pSrc, iLeft,
2c60: 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45   iColLeft);.  pE
2c70: 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  2 = sqlite3Creat
2c80: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
2c90: 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43  pSrc, iRight, iC
2ca0: 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71  olRight);..  pEq
2cb0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2cc0: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
2cd0: 45 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20  E1, pE2);.  if( 
2ce0: 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f  pEq && isOuterJo
2cf0: 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  in ){.    ExprSe
2d00: 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  tProperty(pEq, E
2d10: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
2d20: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2d30: 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  sProperty(pEq, E
2d40: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
2d50: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45  educed) );.    E
2d60: 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2d70: 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75  y(pEq, EP_NoRedu
2d80: 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52  ce);.    pEq->iR
2d90: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
2da0: 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65  (i16)pE2->iTable
2db0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65  ;.  }.  *ppWhere
2dc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2dd0: 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20  d(db, *ppWhere, 
2de0: 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pEq);.}../*.** S
2df0: 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  et the EP_FromJo
2e00: 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61  in property on a
2e10: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
2e20: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
2e30: 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65  ..** And set the
2e40: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
2e50: 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20  Table to iTable 
2e60: 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69  for every term i
2e70: 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  n the.** express
2e80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
2e90: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2ea0: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
2eb0: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
2ec0: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
2ed0: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
2ee0: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
2ef0: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
2f00: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
2f10: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
2f20: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
2f30: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2f40: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
2f50: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
2f60: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
2f70: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
2f80: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
2f90: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
2fa0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
2fb0: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
2fc0: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
2fd0: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
2fe0: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
2ff0: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
3000: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3010: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  use..**.** The E
3020: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
3030: 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48  ble tells the WH
3040: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
3050: 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a  ssing that the.*
3060: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
3070: 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52  ends on table iR
3080: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76  ightJoinTable ev
3090: 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65  en if that table
30a0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69   is not.** expli
30b0: 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20  citly mentioned 
30c0: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
30d0: 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61  n.  That informa
30e0: 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a  tion is needed.*
30f0: 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65  * for cases like
3100: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
3110: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3120: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
3130: 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74   t1.a=t2.b AND t
3140: 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  1.x=5.**.** The 
3150: 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65  where clause nee
3160: 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20  ds to defer the 
3170: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20  handling of the 
3180: 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75  t1.x=5.** term u
3190: 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74  ntil after the t
31a0: 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f  2 loop of the jo
31b0: 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79  in.  In that way
31c0: 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72  , a.** NULL t2 r
31d0: 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  ow will be inser
31e0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e  ted whenever t1.
31f0: 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20  x!=5.  If we do 
3200: 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65  not.** defer the
3210: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e   handling of t1.
3220: 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  x=5, it will be 
3230: 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69  processed immedi
3240: 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74  ately.** after t
3250: 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72  he t1 loop and r
3260: 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35  ows with t1.x!=5
3270: 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65   will never appe
3280: 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74  ar in.** the out
3290: 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e  put, which is in
32a0: 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
32b0: 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45  ic void setJoinE
32c0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
32d0: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
32e0: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
32f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
3300: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
3310: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
3320: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
3330: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
3340: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
3350: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
3360: 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  p, EP_NoReduce);
3370: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
3380: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69  inTable = (i16)i
3390: 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70  Table;.    if( p
33a0: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
33b0: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
33c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
33d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
33e0: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
33f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
3400: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
3410: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3420: 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Expr, iTable);. 
3430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3440: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
3450: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
3460: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
3470: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e  t;.  } .}../* Un
3480: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73  do the work of s
3490: 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49  etJoinExpr().  I
34a0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
34b0: 20 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74   tree p, convert
34c0: 20 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74   every.** term t
34d0: 68 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69  hat is marked wi
34e0: 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61  th EP_FromJoin a
34f0: 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  nd iRightJoinTab
3500: 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a  le==iTable into.
3510: 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  ** an ordinary t
3520: 65 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74  erm that omits t
3530: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d  he EP_FromJoin m
3540: 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ark..**.** This 
3550: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c  happens when a L
3560: 45 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70  EFT JOIN is simp
3570: 6c 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f  lified into an o
3580: 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f  rdinary JOIN..*/
3590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73  .static void uns
35a0: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
35b0: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
35c0: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
35d0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
35e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
35f0: 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28  mJoin).     && (
3600: 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69  iTable<0 || p->i
3610: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
3620: 69 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  iTable) ){.     
3630: 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
3640: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
3650: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
3660: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3670: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3680: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3690: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
36a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
36b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
36c0: 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
36d0: 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  pr(p->x.pList->a
36e0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
36f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3700: 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45  }.    unsetJoinE
3710: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
3720: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
3730: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
3740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3750: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
3760: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
3770: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
3780: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
3790: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
37a0: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
37b0: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
37c0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
37d0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
37e0: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
37f0: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
3800: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
3810: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
3820: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
3830: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
3840: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
3850: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
3860: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
3870: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
3880: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
3890: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
38a0: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
38b0: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
38c0: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
38d0: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
38e0: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
38f0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
3900: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
3910: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
3920: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
3930: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
3940: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
3950: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3960: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
3970: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
3980: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
3990: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
39a0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
39b0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
39c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
39d0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
39e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
39f0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
3a00: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
3a10: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
3a20: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
3a50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
3a90: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
3aa0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3ab0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
3ac0: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
3ae0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3af0: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
3b00: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
3b10: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
3b20: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
3b30: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
3b40: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
3b50: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
3b60: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
3b70: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
3b80: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
3b90: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
3ba0: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
3bb0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
3bc0: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
3bd0: 56 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d  VER(pLeft->pTab=
3be0: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
3bf0: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
3c00: 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70      isOuter = (p
3c10: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3c20: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
3c30: 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
3c40: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
3c50: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
3c60: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
3c70: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
3c80: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
3c90: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
3ca0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
3cb0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
3cc0: 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69  ( pRight->fg.joi
3cd0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
3ce0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
3cf0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
3d00: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3d10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3d20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3d30: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
3d40: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
3d50: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
3d60: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3d70: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
3d80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3d90: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
3da0: 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43   j<pRightTab->nC
3db0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
3dc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
3dd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75   /* Name of colu
3de0: 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  mn in the right 
3df0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3e00: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3e10: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74  /* Matching left
3e20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
3e30: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
3e40: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c   /* Matching col
3e50: 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20  umn in the left 
3e60: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
3e70: 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74    zName = pRight
3e80: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
3ea0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
3eb0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
3ec0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
3ed0: 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20  LeftCol) ){.    
3ee0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
3ef0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
3f00: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3f10: 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20  , i+1, j,.      
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3f40: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
3f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3f60: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
3f70: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
3f80: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
3f90: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
3fa0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3fb0: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
3fc0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
3fd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3fe0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3ff0: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
4000: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
4010: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
4020: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
4030: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4040: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
4050: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
4060: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
4070: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
4080: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
4090: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
40a0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
40b0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
40c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75  {.      if( isOu
40d0: 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70  ter ) setJoinExp
40e0: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
40f0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
4100: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
4110: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4120: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
4130: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
4140: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
4150: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
4160: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4170: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
4180: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
4190: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
41a0: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
41b0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
41c0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
41d0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
41e0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
41f0: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
4200: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
4210: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
4220: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
4230: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
4240: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
4250: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
4260: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
4270: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
4280: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
4290: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
42a0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
42b0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
42c0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
42d0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
42e0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
42f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
4300: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
4310: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
4320: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
4330: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
4340: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
4350: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
4360: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
4370: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4380: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49   term in the USI
4390: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  NG clause */.   
43a0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
43b0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f        /* Table o
43c0: 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20  n the left with 
43d0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
43e0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
43f0: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20  int iLeftCol;   
4400: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
4410: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
4420: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74  lumn on the left
4430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4440: 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20  iRightCol;   /* 
4450: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
4460: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
4470: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
4480: 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ..        zName 
4490: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
44a0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69  ame;.        iRi
44b0: 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49  ghtCol = columnI
44c0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
44d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
44e0: 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a  if( iRightCol<0.
44f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62           || !tab
4500: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
4510: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
4520: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
4530: 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b  tCol).        ){
4540: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4550: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4560: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
4570: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
4580: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
4590: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
45a0: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
45b0: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
45c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
45d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
45e0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
45f0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
4600: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
4610: 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20  +1, iRightCol,. 
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
4640: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
4650: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4660: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4670: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
4680: 74 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64  this object hold
4690: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62  s information (b
46a0: 65 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64  eyond pParse and
46b0: 20 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65   pSelect).** nee
46c0: 64 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  ded to load the 
46d0: 6e 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20  next result row 
46e0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64  that is to be ad
46f0: 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65  ded to the sorte
4700: 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r..*/.typedef st
4710: 72 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f  ruct RowLoadInfo
4720: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74   RowLoadInfo;.st
4730: 72 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f  ruct RowLoadInfo
4740: 20 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75   {.  int regResu
4750: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
4760: 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
4770: 74 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72  ts in array of r
4780: 65 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f  egisters here */
4790: 0a 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b  .  u8 ecelFlags;
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 2f 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74  /* Flag argument
47c0: 20 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72   to ExprCodeExpr
47d0: 4c 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66  List() */.#ifdef
47e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
47f0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
4800: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78  .  ExprList *pEx
4810: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4820: 2f 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73  /* Extra columns
4830: 20 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65   needed by sorte
4840: 72 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20  r refs */.  int 
4850: 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20  regExtraResult; 
4860: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
4870: 65 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78  e to load the ex
4880: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23  tra columns */.#
4890: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
48a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
48b0: 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f  s the work of lo
48c0: 61 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61  ading query data
48d0: 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
48e0: 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  f.** registers s
48f0: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
4900: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f   added to the so
4910: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
4920: 76 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f  void innerLoopLo
4930: 61 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a  adRow(.  Parse *
4940: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4950: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
4960: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4970: 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
4980: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4990: 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79      /* The query
49a0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
49b0: 20 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70    RowLoadInfo *p
49c0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
49d0: 49 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63  Info needed to c
49e0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20  omplete the row 
49f0: 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  load */.){.  sql
4a00: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4a10: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
4a20: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49  lect->pEList, pI
4a30: 6e 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a  nfo->regResult,.
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e            0, pIn
4a60: 66 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a  fo->ecelFlags);.
4a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4a80: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
4a90: 52 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e  RENCES.  if( pIn
4aa0: 66 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20  fo->pExtra ){.  
4ab0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4ac0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4ad0: 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c  , pInfo->pExtra,
4ae0: 20 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61   pInfo->regExtra
4af0: 52 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20  Result, 0, 0);. 
4b00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
4b10: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
4b20: 3e 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74  >db, pInfo->pExt
4b30: 72 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ra);.  }.#endif.
4b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68  }../*.** Code th
4b50: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
4b60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
4b70: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65   generates the e
4b80: 6e 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64  ntry to be.** ad
4b90: 64 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ded into the sor
4ba0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ter..**.** Retur
4bb0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  n the register i
4bc0: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75  n which the resu
4bd0: 6c 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f  lt is stored..*/
4be0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65  .static int make
4bf0: 53 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20  SorterRecord(.  
4c00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
4c10: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
4c20: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
4c30: 63 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73  ct,.  int regBas
4c40: 65 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29  e,.  int nBase.)
4c50: 7b 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  {.  int nOBSat =
4c60: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a   pSort->nOBSat;.
4c70: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4c80: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
4c90: 20 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72   regOut = ++pPar
4ca0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20  se->nMem;.  if( 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69  RowLoad ){.    i
4cd0: 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28  nnerLoopLoadRow(
4ce0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
4cf0: 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65   pSort->pDeferre
4d00: 64 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20  dRowLoad);.  }. 
4d10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d20: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4d30: 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42  ord, regBase+nOB
4d40: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
4d50: 74 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65  t, regOut);.  re
4d60: 74 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a  turn regOut;.}..
4d70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
4d80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
4d90: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
4da0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
4db0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
4dc0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
4dd0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
4de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
4df0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
4e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4e10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
4e20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
4e30: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
4e40: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
4e50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
4e60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
4e70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
4e80: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
4e90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
4ea0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
4eb0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
4ec0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
4ed0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
4ee0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
4ef0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
4f00: 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46  Data,       /* F
4f10: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4f20: 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  lding data befor
4f30: 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  e packing */.  i
4f40: 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20  nt nData,       
4f50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4f60: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
4f70: 68 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20  he regData data 
4f80: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4f90: 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20  PrefixReg       
4fa0: 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20    /* No. of reg 
4fb0: 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61  prior to regData
4fc0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
4fd0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  se */.){.  Vdbe 
4fe0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4ff0: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
5000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5010: 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
5020: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
5030: 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e  bSeq = ((pSort->
5040: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
5050: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d  FLAG_UseSorter)=
5060: 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  =0);.  int nExpr
5070: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
5080: 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20  By->nExpr;      
5090: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
50a0: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
50b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20   */.  int nBase 
50c0: 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b  = nExpr + bSeq +
50d0: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
50e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73         /* Fields
50f0: 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72   in sorter recor
5100: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5110: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20          /* Regs 
5140: 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72  for sorter recor
5150: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  d */.  int regRe
5160: 63 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20  cord = 0;       
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d          /* Assem
5190: 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f  bled sorter reco
51a0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53  rd */.  int nOBS
51b0: 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  at = pSort->nOBS
51c0: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
51d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
51e0: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b  R BY terms to sk
51f0: 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ip */.  int op; 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5220: 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74  code to add sort
5230: 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72  er record to sor
5240: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ter */.  int iLi
5250: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
5260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5270: 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  IMIT counter */.
5280: 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b    int iSkip = 0;
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
52b0: 68 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74  he sorter insert
52c0: 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65   loop */..  asse
52d0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
52e0: 53 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  Seq==1 );..  /* 
52f0: 54 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a  Three cases:.  *
5300: 2a 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61  *   (1) The data
5310: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61   to be sorted ha
5320: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
5330: 61 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63  acked into a Rec
5340: 6f 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62  ord.  **       b
5350: 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b  y a prior OP_Mak
5360: 65 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69  eRecord.  In thi
5370: 73 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20  s case nData==1 
5380: 61 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a  and regData.  **
5390: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63         will be c
53a0: 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61  ompletely unrela
53b0: 74 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61  ted to regOrigDa
53c0: 74 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41  ta..  **   (2) A
53d0: 6c 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  ll output column
53e0: 73 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69  s are included i
53f0: 6e 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72  n the sort recor
5400: 64 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a  d.  In that.  **
5410: 20 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44         case regD
5420: 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61  ata==regOrigData
5430: 2e 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d  ..  **   (3) Som
5440: 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  e output columns
5450: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f   are omitted fro
5460: 6d 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72  m the sort recor
5470: 64 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20  d due to.  **   
5480: 20 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45      the SQLITE_E
5490: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
54a0: 45 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74  ERENCE optimizat
54b0: 69 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74  ion, or due to t
54c0: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51  he.  **       SQ
54d0: 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
54e0: 46 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  F optimization, 
54f0: 6f 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20  or due to the . 
5500: 20 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74   **       SortCt
5510: 78 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f  x.pDeferredRowLo
5520: 61 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20  ad optimiation. 
5530: 20 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65   In any of these
5540: 20 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20   cases.  **     
5550: 20 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73    regOrigData is
5560: 20 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68   0 to prevent th
5570: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
5580: 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20  trying to copy. 
5590: 20 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73   **       values
55a0: 20 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20   that might not 
55b0: 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a  yet exist..  */.
55c0: 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d    assert( nData=
55d0: 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72  =1 || regData==r
55e0: 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65  egOrigData || re
55f0: 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a  gOrigData==0 );.
5600: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65  .  if( nPrefixRe
5610: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
5620: 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78   nPrefixReg==nEx
5630: 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72  pr+bSeq );.    r
5640: 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61  egBase = regData
5650: 20 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20   - nPrefixReg;. 
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42   }else{.    regB
5670: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
5680: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72  em + 1;.    pPar
5690: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73  se->nMem += nBas
56a0: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
56b0: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
56c0: 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d  t==0 || pSelect-
56d0: 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >iLimit!=0 );.  
56e0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
56f0: 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c  ->iOffset ? pSel
5700: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ect->iOffset+1 :
5710: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
5720: 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  ;.  pSort->label
5730: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
5740: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
5750: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5760: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
5770: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
5780: 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f  y, regBase, regO
5790: 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20  rigData,.       
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
57c0: 55 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74  UP | (regOrigDat
57d0: 61 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  a? SQLITE_ECEL_R
57e0: 45 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20  EF : 0));.  if( 
57f0: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
5800: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5810: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
5820: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
5830: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
5840: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
5850: 52 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e  Reg==0 && nData>
5860: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5870: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
5880: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
5890: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
58a0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
58b0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
58c0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
58d0: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
58e0: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
58f0: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
5900: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
5910: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
5920: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
5930: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
5940: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
5950: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
5960: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
5970: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
5980: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
5990: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
59a0: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
59b0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
59c0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
59d0: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
59e0: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
59f0: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
5a00: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
5a10: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
5a20: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
5a30: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
5a40: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
5a50: 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f  gRecord = makeSo
5a60: 72 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73  rterRecord(pPars
5a70: 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63  e, pSort, pSelec
5a80: 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73  t, regBase, nBas
5a90: 65 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b  e);.    regPrevK
5aa0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
5ab0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
5ac0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
5ad0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
5ae0: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
5af0: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
5b00: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
5b10: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
5b20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5b30: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
5b40: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
5b50: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
5b60: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
5b70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b80: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
5b90: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
5ba0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
5bb0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5bc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5bd0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
5be0: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
5bf0: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
5c00: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
5c10: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
5c20: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
5c30: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
5c40: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
5c50: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5c60: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
5c70: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
5c80: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
5c90: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
5ca0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
5cb0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
5cc0: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
5cd0: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
5ce0: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
5cf0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
5d00: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
5d10: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
5d20: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
5d30: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
5d40: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
5d50: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
5d60: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5d70: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
5d80: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
5d90: 50 61 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72  Parse,pSort->pOr
5da0: 64 65 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20  derBy,nOBSat,.  
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41           pKI->nA
5de0: 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65  llField-pKI->nKe
5df0: 79 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  yField-1);.    a
5e00: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
5e10: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5e20: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
5e30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5e40: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
5e50: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
5e60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5e70: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
5e80: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
5e90: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
5ea0: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
5eb0: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
5ec0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
5ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5ee0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
5ef0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
5f00: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
5f10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5f20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
5f30: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
5f40: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
5f50: 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20   if( iLimit ){. 
5f60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5f70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
5f80: 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72  ot, iLimit, pSor
5f90: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20  t->labelDone);. 
5fa0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5fb0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
5fc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5fd0: 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74  ere(v, addrFirst
5fe0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
5ff0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6000: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
6010: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
6020: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
6030: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
6040: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
6050: 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b  .  if( iLimit ){
6060: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
6070: 70 6f 69 6e 74 20 74 68 65 20 76 61 6c 75 65 73  point the values
6080: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 6f 72   for the new sor
6090: 74 65 72 20 65 6e 74 72 79 20 61 72 65 20 73 74  ter entry are st
60a0: 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 61  ored.    ** in a
60b0: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
60c0: 74 65 72 73 2e 20 54 68 65 79 20 6e 65 65 64 20  ters. They need 
60d0: 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64 20 69  to be composed i
60e0: 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a 20 20 20  nto a record.   
60f0: 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74 65 64   ** and inserted
6100: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
6110: 20 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74   if either (a) t
6120: 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
6130: 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74  ly.    ** less t
6140: 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  han LIMIT+OFFSET
6150: 20 69 74 65 6d 73 20 6f 72 20 28 62 29 20 74 68   items or (b) th
6160: 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20  e new record is 
6170: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 20 20  smaller than .  
6180: 20 20 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74    ** the largest
6190: 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c   record currentl
61a0: 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e  y in the sorter.
61b0: 20 49 66 20 28 62 29 20 69 73 20 74 72 75 65 20   If (b) is true 
61c0: 61 6e 64 20 74 68 65 72 65 0a 20 20 20 20 2a 2a  and there.    **
61d0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 4c 49 4d   are already LIM
61e0: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
61f0: 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c 20 64  in the sorter, d
6200: 65 6c 65 74 65 20 74 68 65 20 6c 61 72 67 65 73  elete the larges
6210: 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 62  t.    ** entry b
6220: 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20  efore inserting 
6230: 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54 68 69  the new one. Thi
6240: 73 20 77 61 79 20 74 68 65 72 65 20 61 72 65 20  s way there are 
6250: 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20 20 20 20  never more .    
6260: 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46  ** than LIMIT+OF
6270: 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68  FSET items in th
6280: 65 20 73 6f 72 74 65 72 2e 0a 20 20 20 20 2a 2a  e sorter..    **
6290: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6e  .    ** If the n
62a0: 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20 6e  ew record does n
62b0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  ot need to be in
62c0: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
62d0: 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a 20 6a  sorter,.    ** j
62e0: 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
62f0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
6300: 20 6c 6f 6f 70 2e 20 4f 72 2c 20 69 66 20 74 68   loop. Or, if th
6310: 65 0a 20 20 20 20 2a 2a 20 70 53 6f 72 74 2d 3e  e.    ** pSort->
6320: 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
6330: 70 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  p flag is set to
6340: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
6350: 68 65 20 69 6e 6e 65 72 0a 20 20 20 20 2a 2a 20  he inner.    ** 
6360: 6c 6f 6f 70 20 64 65 6c 69 76 65 72 73 20 69 74  loop delivers it
6370: 65 6d 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  ems in sorted or
6380: 64 65 72 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65  der, jump to the
6390: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a   next iteration.
63a0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 75      ** of the ou
63b0: 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  ter loop..    */
63c0: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d 20  .    int iCsr = 
63d0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b  pSort->iECursor;
63e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
63f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
6400: 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  otZero, iLimit, 
6410: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6420: 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a 20 20  ntAddr(v)+4);.  
6430: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
6440: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6450: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c  beAddOp2(v, OP_L
6460: 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b 0a 20  ast, iCsr, 0);. 
6470: 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69 74     iSkip = sqlit
6480: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
6490: 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20 20 20  v, OP_IdxLE,.   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
64c0: 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  sr, 0, regBase+n
64d0: 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f 42  OBSat, nExpr-nOB
64e0: 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Sat);.    VdbeCo
64f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
6500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6510: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
6520: 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Csr);.  }.  if( 
6530: 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29 7b 0a  regRecord==0 ){.
6540: 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
6550: 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64  makeSorterRecord
6560: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
6570: 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65  pSelect, regBase
6580: 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a 20 20  , nBase);.  }.  
6590: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
65a0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
65b0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
65c0: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
65d0: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
65e0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
65f0: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
6600: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6610: 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  t(v, op, pSort->
6620: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
6630: 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ord,.           
6640: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42              regB
6650: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
6660: 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28  e-nOBSat);.  if(
6670: 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 61 73   iSkip ){.    as
6680: 73 65 72 74 28 20 70 53 6f 72 74 2d 3e 62 4f 72  sert( pSort->bOr
6690: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d 3d  deredInnerLoop==
66a0: 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62 4f 72 64  0 || pSort->bOrd
66b0: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d 3d 31  eredInnerLoop==1
66c0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
66d0: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 69  dbeChangeP2(v, i
66e0: 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20 73  Skip,.         s
66f0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
6700: 74 41 64 64 72 28 76 29 20 2b 20 70 53 6f 72 74  tAddr(v) + pSort
6710: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
6720: 6f 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oop);.  }.}../*.
6730: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
6740: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
6750: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
6760: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
6770: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6780: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6790: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
67a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
67b0: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
67c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
67d0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
67e0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
67f0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
6800: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
6810: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
6820: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
6830: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
6840: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6850: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
6860: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
6870: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6880: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
6890: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
68a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
68b0: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
68c0: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
68d0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
68e0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
68f0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
6900: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
6910: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
6920: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
6930: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
6940: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
6950: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
6960: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
6970: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
6980: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
6990: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
69a0: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
69b0: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
69c0: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
69d0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
69e0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
69f0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
6a00: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
6a10: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
6a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a30: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
6a40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6a60: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6a70: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6a80: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6a90: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6aa0: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6ab0: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6ac0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6ad0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6ae0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
6af0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
6b00: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
6b10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6b20: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
6b30: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
6b40: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6b50: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6b60: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6b70: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6b80: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6b90: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6ba0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6bb0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6bc0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6bd0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6be0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
6bf0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
6c00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6c10: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
6c20: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
6c30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6c40: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6c50: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6c60: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6c70: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c80: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c90: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6ca0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6cb0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6cc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6cd0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6ce0: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
6cf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6d00: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
6d10: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
6d20: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
6d30: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
6d40: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6d50: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6d60: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6d70: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6d80: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6d90: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6da0: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6db0: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6dc0: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6dd0: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6de0: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6df0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6e00: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
6e10: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
6e20: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6e30: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
6e40: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6e50: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6e60: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6e70: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6e80: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6e90: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6ea0: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6eb0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6ec0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6ed0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6ee0: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
6ef0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
6f00: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
6f10: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
6f20: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
6f30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
6f40: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6f50: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6f60: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6f70: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6f80: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6f90: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6fa0: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6fb0: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6fc0: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6fd0: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6fe0: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
6ff0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
7000: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
7010: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
7020: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
7030: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
7040: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
7050: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
7060: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
7070: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
7080: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
7090: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
70a0: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
70b0: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
70c0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
70d0: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
70e0: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
70f0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
7100: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
7110: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
7120: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
7130: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
7140: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
7150: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
7160: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7170: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7180: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
7190: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
71a0: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
71b0: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
71c0: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
71d0: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
71e0: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
71f0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
7200: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7210: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
7220: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
7230: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7240: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
7250: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
7260: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7270: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
7280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7290: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
72a0: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
72b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
72c0: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
72d0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
72e0: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
72f0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
7300: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
7310: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
7320: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
7330: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
7340: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7350: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
7360: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7370: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
7380: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
7390: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
73a0: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
73b0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
73c0: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
73d0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
73e0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
73f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7400: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
7410: 20 26 26 20 70 54 61 62 20 26 26 20 21 49 73 56   && pTab && !IsV
7420: 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20 20 20  irtual(pTab).   
7430: 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43      && (pTab->aC
7440: 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
7450: 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  n].colFlags & CO
7460: 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 29  LFLAG_SORTERREF)
7470: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
7480: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
7490: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66   for(j=0; j<nDef
74a0: 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  er; j++){.      
74b0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 61      if( pSort->a
74c0: 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70  Defer[j].iCsr==p
74d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 62  Expr->iTable ) b
74e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
74f0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
7500: 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Defer ){.       
7510: 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d 3d 41     if( nDefer==A
7520: 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e  rraySize(pSort->
7530: 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20 20 20  aDefer) ){.     
7540: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7550: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7560: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
7570: 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  t nKey = 1;.    
7580: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
7590: 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
75a0: 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20   *pPk = 0;.     
75b0: 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
75c0: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 6b 20              pPk 
75e0: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
75f0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4b                nK
7610: 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  ey = pPk->nKeyCo
7620: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
7630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
7640: 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b  (k=0; k<nKey; k+
7650: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
7660: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
7670: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
7680: 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30  se, TK_COLUMN, 0
7690: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
76a0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pNew->iTable = p
76d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
76f0: 65 77 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ew->pTab = pExpr
7700: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
7710: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43          pNew->iC
7720: 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70 50  olumn = pPk ? pP
7730: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a  k->aiColumn[k] :
7740: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
7750: 20 20 20 20 20 70 45 78 74 72 61 20 3d 20 73 71       pExtra = sq
7760: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
7770: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 78 74  end(pParse, pExt
7780: 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  ra, pNew);.     
7790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
77a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
77b0: 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66       pSort->aDef
77c0: 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62 20  er[nDefer].pTab 
77d0: 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
77e0: 20 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74             pSort
77f0: 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d  ->aDefer[nDefer]
7800: 2e 69 43 73 72 20 3d 20 70 45 78 70 72 2d 3e 69  .iCsr = pExpr->i
7810: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
7820: 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72     pSort->aDefer
7830: 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20  [nDefer].nKey = 
7840: 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
7850: 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20    nDefer++;.    
7860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7870: 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  }.        pItem-
7880: 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20 31 3b  >bSorterRef = 1;
7890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
78a0: 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66   }.  pSort->nDef
78b0: 65 72 20 3d 20 28 75 38 29 6e 44 65 66 65 72 3b  er = (u8)nDefer;
78c0: 0a 20 20 2a 70 70 45 78 74 72 61 20 3d 20 70 45  .  *ppExtra = pE
78d0: 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xtra;.}.#endif..
78e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
78f0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
7900: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
7910: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
7920: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
7930: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
7940: 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74 69  srcTab is negati
7950: 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 2d 3e  ve, then the p->
7960: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
7970: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
7980: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
7990: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
79a0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
79b0: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
79c0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
79d0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
79e0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 2d  om srcTab and p-
79f0: 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20  >pEList is used 
7a00: 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20  only .** to get 
7a10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
7a20: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f  lumns and the co
7a30: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7a40: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
7a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7a60: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
7a70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7a80: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
7a90: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
7aa0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
7ab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7ac0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
7ad0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
7ae0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
7af0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
7b10: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
7b20: 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67  table if non-neg
7b30: 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43  ative */.  SortC
7b40: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
7b50: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
7b60: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
7b70: 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20  o process ORDER 
7b80: 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  BY */.  Distinct
7b90: 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20  Ctx *pDistinct, 
7ba0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
7bb0: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
7bc0: 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20  rocess DISTINCT 
7bd0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
7be0: 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
7bf0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
7c00: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
7c10: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
7c20: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
7c30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
7c40: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
7c50: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
7c60: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
7c70: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
7c80: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
7c90: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  inner loop */.){
7ca0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
7cb0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
7cc0: 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69  t i;.  int hasDi
7cd0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
7ce0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7cf0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
7d00: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
7d10: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
7d20: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
7d30: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
7d40: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
7d50: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
7d60: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20  st->iSDParm; /* 
7d70: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
7d80: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
7d90: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
7da0: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
7db0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7dc0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
7dd0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
7de0: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
7df0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
7e00: 72 61 20 72 65 67 69 73 74 65 72 73 20 62 65 66  ra registers bef
7e10: 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f  ore regResult */
7e20: 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73  .  RowLoadInfo s
7e30: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f  RowLoadInfo;   /
7e40: 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65 66 65 72  * Info for defer
7e50: 72 65 64 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20  red row loading 
7e60: 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  */..  /* Usually
7e70: 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74  , regResult is t
7e80: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  he first cell in
7e90: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d   an array of mem
7ea0: 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63  ory cells.  ** c
7eb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
7ec0: 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77  rrent result row
7ed0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
7ee0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
7ef0: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
7f00: 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  alue. However, i
7f10: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
7f20: 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  e being sent to 
7f30: 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a  the sorter, the.
7f40: 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20    ** values for 
7f50: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20  any expressions 
7f60: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61  that are also pa
7f70: 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b  rt of the sort-k
7f80: 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20  ey are omitted. 
7f90: 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72   ** from this ar
7fa0: 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ray. In this cas
7fb0: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
7fc0: 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20   to zero.  */.  
7fd0: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7ff0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
8000: 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72  olding current r
8010: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
8020: 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20  regOrig;        
8030: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
8040: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
8050: 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28  ng full result (
8060: 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65  or 0) */..  asse
8070: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
8080: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
8090: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
80a0: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
80b0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
80c0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
80d0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
80e0: 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d   pSort && pSort-
80f0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70  >pOrderBy==0 ) p
8100: 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Sort = 0;.  if( 
8110: 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73  pSort==0 && !has
8120: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
8130: 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75  assert( iContinu
8140: 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  e!=0 );.    code
8150: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
8160: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
8170: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
8180: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
8190: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e  olumns..  */.  n
81a0: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70  ResultCol = p->p
81b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
81c0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
81d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
81e0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
81f0: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
8200: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
8210: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
8220: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
8230: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
8240: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
8250: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
8260: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
8270: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
8280: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
8290: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
82a0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
82b0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
82c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
82d0: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
82e0: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
82f0: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
8300: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
8310: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
8320: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
8330: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
8340: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
8350: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
8360: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
8370: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
8380: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
8390: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
83a0: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
83b0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
83c0: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
83d0: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
83e0: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
83f0: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
8400: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
8410: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
8420: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
8430: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
8440: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
8450: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
8460: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
8470: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
8480: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
8490: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
84a0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
84b0: 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74  Orig = regResult
84c0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
84d0: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
84e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
84f0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
8500: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
8510: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8520: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
8530: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
8540: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
8550: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
8560: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
8570: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
8580: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
8590: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
85a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
85b0: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
85c0: 52 45 4e 43 45 53 0a 20 20 20 20 45 78 70 72 4c  RENCES.    ExprL
85d0: 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b  ist *pExtra = 0;
85e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49  .#endif.    /* I
85f0: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
8600: 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e  n is an EXISTS(.
8610: 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ..) expression, 
8620: 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a  the actual.    *
8630: 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  * values returne
8640: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
8650: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
8660: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20  ..    */.    u8 
8670: 65 63 65 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a  ecelFlags;    /*
8680: 20 22 65 63 65 6c 22 20 69 73 20 61 6e 20 61 62   "ecel" is an ab
8690: 62 72 65 76 69 61 74 69 6f 6e 20 6f 66 20 22 45  breviation of "E
86a0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 22  xprCodeExprList"
86b0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
86c0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66   *pEList;.    if
86d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
86e0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f   || eDest==SRT_O
86f0: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
8700: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
8710: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
8720: 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   = SQLITE_ECEL_D
8730: 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UP;.    }else{. 
8740: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
8750: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
8760: 28 20 70 53 6f 72 74 20 26 26 20 68 61 73 44 69  ( pSort && hasDi
8770: 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65 44 65  stinct==0 && eDe
8780: 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st!=SRT_EphemTab
8790: 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 54   && eDest!=SRT_T
87a0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
87b0: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
87c0: 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73  sion in p->pELis
87d0: 74 20 74 68 61 74 20 69 73 20 61 20 63 6f 70 79  t that is a copy
87e0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
87f0: 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  n in.      ** th
8800: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8810: 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  e (pSort->pOrder
8820: 42 79 29 2c 20 73 65 74 20 74 68 65 20 61 73 73  By), set the ass
8830: 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20 20 2a  ociated .      *
8840: 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  * iOrderByCol va
8850: 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  lue to one more 
8860: 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  than the index o
8870: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 0a  f the ORDER BY .
8880: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
8890: 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ion within the s
88a0: 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70 75 73  ort-key that pus
88b0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 69  hOntoSorter() wi
88c0: 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ll generate..   
88d0: 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77     ** This allow
88e0: 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20  s the p->pEList 
88f0: 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74  field to be omit
8900: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ted from the sor
8910: 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20 20 20  ted record,.    
8920: 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70 61 63    ** saving spac
8930: 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c 65 73  e and CPU cycles
8940: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c  .  */.      ecel
8950: 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  Flags |= (SQLITE
8960: 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51  _ECEL_OMITREF|SQ
8970: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a  LITE_ECEL_REF);.
8980: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 6f  .      for(i=pSo
8990: 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53  rt->nOBSat; i<pS
89a0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
89b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
89c0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
89d0: 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f 72     if( (j = pSor
89e0: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  t->pOrderBy->a[i
89f0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
8a00: 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l)>0 ){.        
8a10: 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a    p->pEList->a[j
8a20: 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  -1].u.x.iOrderBy
8a30: 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d  Col = i+1-pSort-
8a40: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20  >nOBSat;.       
8a50: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
8a60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8a70: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
8a80: 53 0a 20 20 20 20 20 20 73 65 6c 65 63 74 45 78  S.      selectEx
8a90: 70 72 44 65 66 65 72 28 70 50 61 72 73 65 2c 20  prDefer(pParse, 
8aa0: 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74  pSort, p->pEList
8ab0: 2c 20 26 70 45 78 74 72 61 29 3b 0a 20 20 20 20  , &pExtra);.    
8ac0: 20 20 69 66 28 20 70 45 78 74 72 61 20 26 26 20    if( pExtra && 
8ad0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
8ae0: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
8af0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
8b00: 72 65 20 61 72 65 20 61 6e 79 20 65 78 74 72 61  re are any extra
8b10: 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61   PK columns to a
8b20: 64 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  dd to the sorter
8b30: 20 72 65 63 6f 72 64 73 2c 0a 20 20 20 20 20 20   records,.      
8b40: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78    ** allocate ex
8b50: 74 72 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tra memory cells
8b60: 20 61 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20   and adjust the 
8b70: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
8b80: 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75         ** instru
8b90: 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74  ction to account
8ba0: 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65 72 20   for the larger 
8bb0: 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 69 73  records. This is
8bc0: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a   only.        **
8bd0: 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
8be0: 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
8bf0: 72 65 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  re WITHOUT ROWID
8c00: 20 74 61 62 6c 65 73 20 77 69 74 68 0a 20 20 20   tables with.   
8c10: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74       ** composit
8c20: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69  e primary keys i
8c30: 6e 20 74 68 65 20 53 6f 72 74 43 74 78 2e 61 44  n the SortCtx.aD
8c40: 65 66 65 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a  efer[] array.  *
8c50: 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  /.        VdbeOp
8c60: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
8c70: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
8c80: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
8c90: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
8ca0: 70 32 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e  p2 += (pExtra->n
8cb0: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44  Expr - pSort->nD
8cc0: 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  efer);.        p
8cd0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d  Op->p4.pKeyInfo-
8ce0: 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70  >nAllField += (p
8cf0: 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70  Extra->nExpr - p
8d00: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20  Sort->nDefer);. 
8d10: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
8d20: 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e  Mem += pExtra->n
8d30: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Expr;.      }.#e
8d40: 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41  ndif..      /* A
8d50: 64 6a 75 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c  djust nResultCol
8d60: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
8d70: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
8d80: 20 6f 6d 69 74 74 65 64 0a 20 20 20 20 20 20 2a   omitted.      *
8d90: 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  * from the sorte
8da0: 72 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  r by the optimiz
8db0: 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 62  ations in this b
8dc0: 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 70  ranch */.      p
8dd0: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
8de0: 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
8df0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
8e00: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
8e10: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
8e20: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
8e30: 6c 3e 30 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l>0.#ifdef SQLIT
8e40: 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
8e50: 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20  REFERENCES.     
8e60: 20 20 20 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61      || pEList->a
8e70: 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 0a 23  [i].bSorterRef.#
8e80: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b  endif.        ){
8e90: 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65 73 75  .          nResu
8ea0: 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20  ltCol--;.       
8eb0: 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a     regOrig = 0;.
8ec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ed0: 7d 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  }..      testcas
8ee0: 65 28 20 72 65 67 4f 72 69 67 20 29 3b 0a 20 20  e( regOrig );.  
8ef0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8f00: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a  est==SRT_Set );.
8f10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8f20: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29  eDest==SRT_Mem )
8f30: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8f40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
8f50: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
8f60: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8f70: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
8f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
8f90: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
8fa0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
8fb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
8fc0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8fd0: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
8fe0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
8ff0: 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f      sRowLoadInfo
9000: 2e 72 65 67 52 65 73 75 6c 74 20 3d 20 72 65 67  .regResult = reg
9010: 52 65 73 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77  Result;.    sRow
9020: 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61  LoadInfo.ecelFla
9030: 67 73 20 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a  gs = ecelFlags;.
9040: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9050: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
9060: 52 45 4e 43 45 53 0a 20 20 20 20 73 52 6f 77 4c  RENCES.    sRowL
9070: 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d  oadInfo.pExtra =
9080: 20 70 45 78 74 72 61 3b 0a 20 20 20 20 73 52 6f   pExtra;.    sRo
9090: 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 45 78 74  wLoadInfo.regExt
90a0: 72 61 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65  raResult = regRe
90b0: 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f  sult + nResultCo
90c0: 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78 74 72  l;.    if( pExtr
90d0: 61 20 29 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b  a ) nResultCol +
90e0: 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b  = pExtra->nExpr;
90f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
9100: 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20 20 20 26  p->iLimit.     &
9110: 26 20 28 65 63 65 6c 46 6c 61 67 73 20 26 20 53  & (ecelFlags & S
9120: 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
9130: 45 46 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20  EF)!=0 .     && 
9140: 6e 50 72 65 66 69 78 52 65 67 3e 30 0a 20 20 20  nPrefixReg>0.   
9150: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9160: 28 20 70 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20  ( pSort!=0 );.  
9170: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 73 44      assert( hasD
9180: 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
9190: 20 20 20 20 70 53 6f 72 74 2d 3e 70 44 65 66 65      pSort->pDefe
91a0: 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73  rredRowLoad = &s
91b0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20  RowLoadInfo;.   
91c0: 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a     regOrig = 0;.
91d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
91e0: 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f   innerLoopLoadRo
91f0: 77 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 52  w(pParse, p, &sR
9200: 6f 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20  owLoadInfo);.   
9210: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9220: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
9230: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
9240: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
9250: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
9260: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
9270: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
9280: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
9290: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
92a0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
92b0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
92c0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
92d0: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
92e0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
92f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
9300: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
9310: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
9320: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
9330: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
9340: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
9350: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
9360: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
9370: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
9380: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
9390: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
93a0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
93c0: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
93d0: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
93e0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
93f0: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
9400: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
9410: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
9420: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
9430: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9440: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
9450: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
9460: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
9470: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
9480: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
9490: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
94a0: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
94b0: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
94c0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
94d0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
94e0: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
94f0: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
9500: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
9510: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
9520: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
9530: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
9540: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
9550: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
9560: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
9570: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
9580: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9590: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
95a0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
95b0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
95c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
95d0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
95e0: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
95f0: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
9600: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
9610: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
9620: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
9630: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
9640: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
9650: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
9660: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9670: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
9680: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
9690: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
96a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
96b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
96c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
96d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
96e0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
96f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
9700: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
9710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9730: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
9740: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
9750: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
9760: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
9770: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
9780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
97a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
97b0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
97c0: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
97d0: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
97e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
97f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
9800: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9810: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
9820: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
9830: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
9840: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
9850: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
9860: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
9870: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
9880: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
9890: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
98a0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
98b0: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
98c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
98d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
98e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
98f0: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
9900: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
9910: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
9920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9930: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
9940: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
9950: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
9960: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9970: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
9980: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
9990: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
99a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
99b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
99c0: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
99d0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
99e0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
99f0: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
9a00: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
9a10: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
9a20: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
9a30: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
9a40: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
9a50: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
9a60: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
9a70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9a80: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
9a90: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
9aa0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
9ab0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
9ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
9ad0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
9ae0: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
9af0: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
9b00: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
9b10: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
9b20: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
9b30: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
9b40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9b50: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9b60: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
9b70: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
9b80: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
9b90: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
9ba0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
9bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9bc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
9bd0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
9be0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9bf0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
9c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
9c10: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
9c20: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
9c30: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
9c40: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
9c50: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9c60: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9c70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c80: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
9c90: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
9ca0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
9cb0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
9cc0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
9cd0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
9ce0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
9cf0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
9d00: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
9d10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
9d20: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
9d30: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
9d40: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
9d50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9d60: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
9d70: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
9d80: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
9d90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9da0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9db0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9dc0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
9dd0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
9de0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
9df0: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
9e00: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9e10: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
9e20: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
9e30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
9e40: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
9e50: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
9e60: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
9e70: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
9e80: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
9e90: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
9ea0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
9eb0: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
9ec0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9ed0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
9ee0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9ef0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
9f00: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
9f10: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9f20: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
9f30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f40: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
9f50: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
9f60: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
9f70: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
9f80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9f90: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
9fa0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
9fb0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
9fc0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
9fd0: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
9fe0: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
9ff0: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
a000: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
a010: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
a020: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
a030: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
a040: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
a050: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
a060: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
a070: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
a080: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
a090: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
a0a0: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
a0b0: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
a0c0: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
a0d0: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
a0e0: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
a0f0: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
a100: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
a110: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
a120: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
a130: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a140: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
a150: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
a160: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
a170: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
a180: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
a190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a1a0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
a1b0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
a1c0: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
a1d0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
a1e0: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
a1f0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
a200: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
a210: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  rt ){.        as
a220: 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d  sert( regResult=
a230: 3d 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20  =regOrig );.    
a240: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a250: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
a260: 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  , p, r1+nPrefixR
a270: 65 67 2c 20 72 65 67 4f 72 69 67 2c 20 31 2c 20  eg, regOrig, 1, 
a280: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
a290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a2a0: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
a2b0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a2c0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
a2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a2e0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
a2f0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
a300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a310: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
a320: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
a330: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
a340: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
a350: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
a360: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a370: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
a380: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
a390: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a3a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
a3b0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
a3c0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
a3d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a3e0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a3f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
a400: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
a410: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
a420: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
a430: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
a440: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
a450: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
a460: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
a470: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
a480: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
a490: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
a4a0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
a4b0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
a4c0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
a4d0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
a4e0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
a4f0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
a500: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
a510: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
a520: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
a530: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
a540: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
a550: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
a560: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
a570: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
a580: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
a590: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
a5a0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
a5b0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
a5c0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
a5d0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
a5e0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
a5f0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
a610: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
a620: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
a630: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
a640: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
a650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a660: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
a670: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
a680: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
a690: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
a6a0: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
a6b0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
a6c0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
a6d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
a6e0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a6f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
a700: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
a710: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
a720: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
a730: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
a740: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
a750: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
a760: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
a770: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a790: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a7a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a7b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
a7c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
a7d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
a7e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a7f0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
a800: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a810: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a820: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
a830: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
a840: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
a850: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
a860: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
a870: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
a880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a890: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a8a0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
a8b0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
a8c0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
a8d0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
a8e0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
a8f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a900: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
a910: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
a920: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
a930: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
a940: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
a950: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
a960: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
a970: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
a980: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
a990: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
a9a0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
a9b0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
a9c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
a9d0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
a9e0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
a9f0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
aa00: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
aa10: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
aa20: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
aa30: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
aa40: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
aa50: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
aa60: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
aa70: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
aa80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
aa90: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
aaa0: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
aab0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
aac0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
aad0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
aae0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
aaf0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
ab00: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
ab10: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
ab20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ab30: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
ab40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ab50: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
ab60: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
ab70: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
ab80: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
ab90: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
aba0: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
abb0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
abc0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
abd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
abe0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
abf0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
ac00: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
ac10: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
ac20: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
ac30: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
ac40: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
ac50: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
ac60: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
ac70: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
aca0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
acb0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
acc0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
acd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ace0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
acf0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
ad00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ad20: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
ad30: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
ad40: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
ad50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ad60: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
ad70: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
ad80: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
ad90: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
ada0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
adb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
adc0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
add0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
ade0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
adf0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
ae00: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
ae10: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
ae20: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
ae30: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
ae40: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
ae50: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
ae60: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
ae70: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
ae80: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
ae90: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
aea0: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
aeb0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
aec0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
aed0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
aee0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
aef0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
af00: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
af10: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
af20: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
af30: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
af40: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
af50: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
af60: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
af70: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
af80: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
af90: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
afa0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
afb0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
afc0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
afd0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
afe0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
aff0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
b000: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
b010: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
b020: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
b030: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b040: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
b050: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
b060: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
b070: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
b080: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
b090: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
b0a0: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
b0b0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
b0c0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
b0d0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
b0e0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
b0f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
b100: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
b110: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
b120: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
b130: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
b140: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
b150: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
b160: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
b170: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
b180: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
b190: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
b1a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
b1d0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
b1e0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b1f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b200: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b210: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b220: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
b230: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
b240: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
b250: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
b260: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
b270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b280: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
b290: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
b2a0: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
b2b0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
b2c0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
b2d0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
b2e0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
b2f0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
b300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b310: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b320: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
b350: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
b360: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
b390: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b3a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b3b0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
b3c0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
b3d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
b3f0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
b400: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
b410: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b420: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
b430: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
b440: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
b450: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
b460: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
b470: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
b480: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
b490: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
b4a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
b4b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b4c0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
b4d0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
b4e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b4f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b500: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
b510: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
b520: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
b530: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
b540: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
b550: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
b560: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
b570: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
b580: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
b590: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
b5a0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
b5b0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
b5c0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
b5d0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
b5e0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
b5f0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
b600: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
b610: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
b620: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
b630: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
b640: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b650: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
b660: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
b670: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b680: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
b690: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
b6a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
b6b0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
b6c0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
b6d0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
b6e0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
b6f0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
b700: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
b710: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
b720: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
b730: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
b740: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
b750: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
b760: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b770: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
b780: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
b790: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
b7a0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
b7b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
b7c0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
b7d0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
b7e0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
b7f0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
b800: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
b810: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
b820: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
b830: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
b840: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
b850: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
b860: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
b870: 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c  +1) - sizeof(Col
b880: 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66  lSeq*);.  KeyInf
b890: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
b8a0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b8b0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
b8c0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
b8d0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
b8e0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
b8f0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
b900: 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20     p->nKeyField 
b910: 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d  = (u16)N;.    p-
b920: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31  >nAllField = (u1
b930: 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e  6)(N+X);.    p->
b940: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
b950: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
b960: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
b970: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d      memset(&p[1]
b980: 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20  , 0, nExtra);.  
b990: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b9a0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
b9b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
b9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
b9d0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
b9e0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
b9f0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
ba00: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
ba10: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
ba20: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
ba30: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
ba40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
ba50: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
ba60: 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b  reeNN(p->db, p);
ba70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
ba80: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
ba90: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
baa0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
bab0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
bac0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
bad0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
bae0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
baf0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
bb00: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
bb10: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
bb20: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
bb30: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
bb40: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
bb50: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
bb60: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
bb70: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
bb80: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
bb90: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
bba0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
bbb0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
bbc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bbd0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
bbe0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
bbf0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
bc00: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
bc10: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
bc20: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
bc30: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
bc40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
bc50: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
bc60: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
bc70: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
bc80: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
bc90: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
bca0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
bcb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
bcc0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
bcd0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
bce0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
bcf0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
bd00: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
bd10: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
bd20: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
bd30: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
bd40: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
bd50: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
bd60: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
bd70: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
bd80: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
bd90: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
bda0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
bdb0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
bdc0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
bdd0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
bde0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
bdf0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
be00: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
be10: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
be20: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
be30: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
be40: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
be50: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
be60: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
be70: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
be80: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
be90: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
bea0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
beb0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
bec0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
bed0: 66 72 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  freed..*/.KeyInf
bee0: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
bef0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
bf00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bf10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
bf20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
bf30: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
bf40: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
bf50: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
bf60: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
bf70: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
bf80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
bf90: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
bfa0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
bfb0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
bfc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
bfd0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
bfe0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
bff0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
c000: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
c010: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
c020: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
c030: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
c040: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c050: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
c060: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
c070: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
c080: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
c090: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
c0a0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
c0b0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
c0c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c0d0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
c0e0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
c0f0: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
c100: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
c110: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
c120: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
c130: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
c140: 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71  l[i-iStart] = sq
c150: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
c160: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
c170: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
c180: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
c190: 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49  r[i-iStart] = pI
c1a0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
c1b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c1c0: 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  rn pInfo;.}../*.
c1d0: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
c1e0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
c1f0: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
c200: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
c210: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c220: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
c230: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
c240: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
c250: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
c260: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
c270: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
c280: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c290: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
c2a0: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
c2b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
c2c0: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
c2d0: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
c2e0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
c2f0: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
c300: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
c310: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
c320: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
c330: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
c340: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
c350: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
c360: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
c370: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
c380: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
c390: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
c3a0: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
c3b0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
c3c0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
c3d0: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
c3e0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
c3f0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
c400: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
c410: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
c420: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
c430: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
c440: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
c450: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
c460: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
c470: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
c480: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
c490: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
c4a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
c4b0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
c4c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
c4d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
c4e0: 65 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  e){.  ExplainQue
c4f0: 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
c500: 30 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  0, "USE TEMP B-T
c510: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
c520: 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
c530: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
c540: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
c550: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
c560: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
c570: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
c580: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
c590: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
c5a0: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
c5b0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
c5c0: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
c5d0: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
c5e0: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
c5f0: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
c600: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
c610: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
c620: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
c630: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
c640: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
c650: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
c660: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
c670: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
c680: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
c690: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
c6a0: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
c6b0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
c6c0: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
c6d0: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
c6e0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
c6f0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
c700: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
c710: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
c720: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  y,z).#endif.../*
c730: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
c740: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
c750: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
c760: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
c770: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
c780: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
c790: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
c7a0: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
c7b0: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
c7c0: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
c7d0: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
c7e0: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
c7f0: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
c800: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
c810: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
c820: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
c830: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
c840: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
c850: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
c860: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
c870: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c880: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
c890: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
c8a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
c8b0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
c8c0: 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  rt,   /* Informa
c8d0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45  tion on the ORDE
c8e0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
c8f0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
c900: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c910: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
c920: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
c930: 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20  *pDest /* Write 
c940: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
c950: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
c960: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c970: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c990: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
c9a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
c9b0: 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72  addrBreak = pSor
c9c0: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20  t->labelDone;   
c9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
c9e0: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
c9f0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
ca00: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
ca10: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ca20: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
ca30: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
ca40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
ca70: 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d  output loop. Jum
ca80: 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20  p for Next. */. 
ca90: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
caa0: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
cab0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
cac0: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
cad0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
cae0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
caf0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
cb00: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
cb10: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
cb20: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
cb30: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
cb40: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   nKey;          
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb60: 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f  Number of key co
cb70: 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65 72 20  lumns in sorter 
cb80: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
cb90: 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20  iSortTab;       
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cbb0: 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20  orter cursor to 
cbc0: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
cbd0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
cbe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cbf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
cc00: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
cc10: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
cc20: 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  o. */.  int nRef
cc30: 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  Key = 0;.  struc
cc40: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
cc50: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
cc60: 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72  ist->a;..  asser
cc70: 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29  t( addrBreak<0 )
cc80: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c  ;.  if( pSort->l
cc90: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
cca0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ccb0: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
ccc0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
ccd0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
cce0: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
ccf0: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
cd00: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  rBreak);.    sql
cd10: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
cd20: 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c  abel(v, pSort->l
cd30: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a  abelBkOut);.  }.
cd40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cd50: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
cd60: 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65  ERENCES.  /* Ope
cd70: 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20 6e 65  n any cursors ne
cd80: 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65 72 2d  eded for sorter-
cd90: 72 65 66 65 72 65 6e 63 65 20 65 78 70 72 65 73  reference expres
cda0: 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69  sions */.  for(i
cdb0: 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65  =0; i<pSort->nDe
cdc0: 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  fer; i++){.    T
cdd0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f  able *pTab = pSo
cde0: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54  rt->aDefer[i].pT
cdf0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20  ab;.    int iDb 
ce00: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ce10: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
ce20: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
ce30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  );.    sqlite3Op
ce40: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
ce50: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
ce60: 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54 61 62  .iCsr, iDb, pTab
ce70: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
ce80: 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41      nRefKey = MA
ce90: 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f 72 74  X(nRefKey, pSort
cea0: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79  ->aDefer[i].nKey
ceb0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
cec0: 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69   iTab = pSort->i
ced0: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
cee0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
cef0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
cf00: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
cf10: 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20  t==SRT_Mem ){.  
cf20: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
cf30: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65      regRow = pDe
cf40: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c  st->iSdst;.  }el
cf50: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
cf60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
cf70: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
cf80: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
cf90: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
cfa0: 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Parse, nColumn);
cfb0: 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f  .  }.  nKey = pO
cfc0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20  rderBy->nExpr - 
cfd0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
cfe0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
cff0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
d000: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
d010: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
d020: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d030: 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20  m;.    iSortTab 
d040: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d050: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
d060: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
d070: 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20       addrOnce = 
d080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d090: 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
d0a0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d0b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d0c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d0d0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53  P_OpenPseudo, iS
d0e0: 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  ortTab, regSortO
d0f0: 75 74 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65  ut, .        nKe
d100: 79 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66  y+1+nColumn+nRef
d110: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Key);.    if( ad
d120: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
d130: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d140: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
d150: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
d160: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d170: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
d180: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
d190: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d1a0: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
d1b0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
d1c0: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
d1d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d1e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
d1f0: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
d200: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
d210: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
d220: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
d230: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
d240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d250: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
d260: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
d270: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d280: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
d290: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
d2a0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
d2b0: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
d2c0: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
d2d0: 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f  }.  for(i=0, iCo
d2e0: 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69  l=nKey+bSeq-1; i
d2f0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
d300: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d310: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
d320: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61  RENCES.    if( a
d330: 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72  OutEx[i].bSorter
d340: 52 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Ref ) continue;.
d350: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61  #endif.    if( a
d360: 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72  OutEx[i].u.x.iOr
d370: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43  derByCol==0 ) iC
d380: 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ol++;.  }.#ifdef
d390: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d3a0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
d3b0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44  .  if( pSort->nD
d3c0: 65 66 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  efer ){.    int 
d3d0: 69 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20  iKey = iCol+1;. 
d3e0: 20 20 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20     int regKey = 
d3f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
d400: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66  nge(pParse, nRef
d410: 4b 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Key);..    for(i
d420: 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65  =0; i<pSort->nDe
d430: 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  fer; i++){.     
d440: 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72   int iCsr = pSor
d450: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73  t->aDefer[i].iCs
d460: 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  r;.      Table *
d470: 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44  pTab = pSort->aD
d480: 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20  efer[i].pTab;.  
d490: 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70      int nKey = p
d4a0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
d4b0: 6e 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c  nKey;..      sql
d4c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d4d0: 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
d4e0: 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48  sr);.      if( H
d4f0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
d500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d510: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d520: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
d530: 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65  b, iKey++, regKe
d540: 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
d550: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d560: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69   OP_SeekRowid, i
d570: 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Csr, .          
d580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
d590: 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72  rentAddr(v)+1, r
d5a0: 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65  egKey);.      }e
d5b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
d5c0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   k;.        int 
d5d0: 69 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  iJmp;.        as
d5e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 72 69  sert( sqlite3Pri
d5f0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
d600: 62 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65  b)->nKeyCol==nKe
d610: 79 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y );.        for
d620: 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b  (k=0; k<nKey; k+
d630: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
d640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d650: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d660: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d670: 72 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20  regKey+k);.     
d680: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d     }.        iJm
d690: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
d6a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
d6b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d6c0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
d6d0: 50 5f 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20  P_SeekGE, iCsr, 
d6e0: 69 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20  iJmp+2, regKey, 
d6f0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73  nKey);.        s
d700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d710: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c  Int(v, OP_IdxLE,
d720: 20 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72   iCsr, iJmp+3, r
d730: 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20  egKey, nKey);.  
d740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d750: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
d760: 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20  llRow, iCsr);.  
d770: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d780: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d790: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
d7a0: 72 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29  regKey, nRefKey)
d7b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
d7c0: 6f 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  or(i=nColumn-1; 
d7d0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64  i>=0; i--){.#ifd
d7e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d7f0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
d800: 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45  ES.    if( aOutE
d810: 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20  x[i].bSorterRef 
d820: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d830: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d840: 20 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72   aOutEx[i].pExpr
d850: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d860: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
d870: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52    {.      int iR
d880: 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ead;.      if( a
d890: 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72  OutEx[i].u.x.iOr
d8a0: 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20  derByCol ){.    
d8b0: 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74      iRead = aOut
d8c0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
d8d0: 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d  ByCol-1;.      }
d8e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52  else{.        iR
d8f0: 65 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20  ead = iCol--;.  
d900: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d910: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d920: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
d930: 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67  tTab, iRead, reg
d940: 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  Row+i);.      Vd
d950: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
d960: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
d970: 61 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  ame?aOutEx[i].zN
d980: 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e  ame : aOutEx[i].
d990: 7a 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  zSpan));.    }. 
d9a0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65   }.  switch( eDe
d9b0: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
d9c0: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
d9d0: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
d9e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
d9f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
da00: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
da10: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
da20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
da30: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
da40: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
da50: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
da60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
da70: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
da80: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
da90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
daa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dab0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
dac0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
dad0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
dae0: 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  umn==sqlite3Strl
daf0: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
db00: 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73  Sdst) );.      s
db10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
db20: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
db30: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
db40: 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20  mn, regRowid,.  
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66        pDest->zAf
db70: 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  fSdst, nColumn);
db80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
db90: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
dba0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
dbb0: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
dbc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dbd0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
dbe0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
dbf0: 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67  m, regRowid, reg
dc00: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
dc10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc20: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
dc30: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  em: {.      /* T
dc40: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
dc50: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
dc60: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
dc70: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
dc80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
dc90: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
dca0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
dcb0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
dcc0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
dcd0: 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73  ne ); .      tes
dce0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
dcf0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
dd00: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
dd10: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
dd20: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
dd30: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
dd40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dd50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dd60: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
dd70: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
dd80: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
dd90: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
dda0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
ddb0: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  rse, pDest->iSds
ddc0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
ddd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dde0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ddf0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
de00: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
de10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
de20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
de30: 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20  .  if( regRowid 
de40: 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  ){.    if( eDest
de50: 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20  ==SRT_Set ){.   
de60: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
de70: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
de80: 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  e, regRow, nColu
de90: 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  mn);.    }else{.
dea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
deb0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
dec0: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  se, regRow);.   
ded0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
dee0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
def0: 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
df00: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74    }.  /* The bot
df10: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
df20: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
df30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
df40: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
df50: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
df60: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
df70: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
df80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
df90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
dfa0: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
dfb0: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
dfc0: 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(v);.  }else{. 
dfd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dfe0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
dff0: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
e000: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
e010: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
e020: 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69  regReturn ) sqli
e030: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e040: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72   OP_Return, pSor
e050: 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  t->regReturn);. 
e060: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
e070: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
e080: 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Break);.}../*.**
e090: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
e0a0: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
e0b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
e0c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
e0d0: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
e0e0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
e0f0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
e100: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
e110: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
e120: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
e130: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
e140: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
e150: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
e160: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
e170: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
e180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
e190: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
e1a0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
e1b0: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
e1c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
e1d0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
e1e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e1f0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
e200: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e210: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
e220: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
e230: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
e240: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
e250: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
e260: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
e270: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
e280: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
e290: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
e2a0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
e2b0: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
e2c0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
e2d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e2e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e2f0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
e300: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
e310: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
e320: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
e330: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
e340: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
e350: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
e360: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
e370: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
e380: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
e390: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
e3a0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
e3b0: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
e3c0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
e3d0: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
e3e0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
e3f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
e400: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e410: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
e420: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
e430: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
e440: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
e450: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
e460: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e470: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
e480: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
e490: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
e4a0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
e4b0: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
e4c0: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
e4d0: 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,D,E) columnType
e4e0: 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a  Impl(A,B,C,D,E).
e4f0: 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66  #else /* if !def
e500: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
e510: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
e520: 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  TA) */.# define 
e530: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
e540: 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,D,E) columnType
e550: 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  Impl(A,B).#endif
e560: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
e570: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
e580: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
e590: 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66  t *pNC, .#ifndef
e5a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
e5b0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
e5c0: 20 45 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c   Expr *pExpr.#el
e5d0: 73 65 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  se.  Expr *pExpr
e5e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e5f0: 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e  *pzOrigDb,.  con
e600: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
e610: 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
e620: 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65  r **pzOrigCol.#e
e630: 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63  ndif.){.  char c
e640: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
e650: 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66  .  int j;.#ifdef
e660: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
e670: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
e680: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
e690: 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  igDb = 0;.  char
e6a0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62   const *zOrigTab
e6b0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
e6c0: 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  st *zOrigCol = 0
e6d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
e6e0: 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
e6f0: 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
e700: 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
e710: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e720: 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
e730: 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75   );  /* This rou
e740: 74 69 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72  tine runes befor
e750: 65 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 20  e aggregates.   
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65      ** are proce
e790: 73 73 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68  ssed */.  switch
e7a0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
e7b0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
e7c0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
e7d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e7e0: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
e7f0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
e800: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
e810: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
e820: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
e830: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
e840: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
e850: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
e860: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
e870: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
e880: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
e890: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
e8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
e8b0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
e8c0: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
e8d0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
e8e0: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
e8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
e900: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
e910: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
e920: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
e930: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
e940: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
e950: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
e960: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
e970: 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b   pNC && !pTab ){
e980: 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74  .        SrcList
e990: 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43   *pTabList = pNC
e9a0: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
e9b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54      for(j=0;j<pT
e9c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
e9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
e9e0: 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69  Cursor!=pExpr->i
e9f0: 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20  Table;j++);.    
ea00: 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69      if( j<pTabLi
ea10: 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  st->nSrc ){.    
ea20: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
ea30: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
ea40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d  ;.          pS =
ea50: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
ea60: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
ea70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ea80: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
ea90: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
eaa0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
eab0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
eac0: 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69      /* At one ti
ead0: 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73  me, code such as
eae0: 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20   "SELECT new.x" 
eaf0: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
eb00: 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
eb10: 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e  * cause this con
eb20: 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20  dition to run.  
eb30: 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68  Since then, we h
eb40: 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64  ave restructured
eb50: 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   how.        ** 
eb60: 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20  trigger code is 
eb70: 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f  generated and so
eb80: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
eb90: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20  is no longer .  
eba0: 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
ebb0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63  e. However, it c
ebc0: 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65  an still be true
ebd0: 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20   for statements 
ebe0: 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  like.        ** 
ebf0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
ec00: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
ec10: 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
ec20: 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47  BLE t1(col INTEG
ec30: 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20  ER);.        ** 
ec40: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
ec50: 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52   t1.col) FROM FR
ec60: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a  OM t1;.        *
ec70: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
ec80: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ec90: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
eca0: 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63  expression "t1.c
ecb0: 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ol" in the .    
ecc0: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
ecd0: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  t. In this case,
ece0: 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   set the column 
ecf0: 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76  type to NULL, ev
ed00: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
ed10: 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72  ough it should r
ed20: 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45  eally be "INTEGE
ed30: 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  R"..        **. 
ed40: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
ed50: 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c  s not a problem,
ed60: 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   as the column t
ed70: 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20  ype of "t1.col" 
ed80: 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20  is never.       
ed90: 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63   ** used. When c
eda0: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
edb0: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
edc0: 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20  ression .       
edd0: 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e   ** "(SELECT t1.
ede0: 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65  col)", the corre
edf0: 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72  ct type is retur
ee00: 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f  ned (see the TK_
ee10: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a  SELECT.        *
ee20: 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20  * branch below. 
ee30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
ee40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
ee50: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
ee60: 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70  & pExpr->pTab==p
ee70: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
ee80: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
ee90: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
eea0: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
eeb0: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
eec0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
eed0: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
eee0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
eef0: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
ef00: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
ef10: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
ef20: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
ef30: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
ef40: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
ef50: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
ef60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
ef70: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
ef80: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
ef90: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
efa0: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
efb0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
efc0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
efd0: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
efe0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
eff0: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
f000: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
f010: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
f020: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
f030: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
f040: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
f050: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
f060: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
f070: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
f080: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
f090: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
f0a0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
f0b0: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
f0c0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
f0d0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
f0e0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
f0f0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
f100: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
f110: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
f120: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
f130: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
f140: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
f150: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
f160: 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20  &zOrigCol); .   
f170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f180: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  se{.        /* A
f190: 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61   real table or a
f1a0: 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20   CTE table */.  
f1b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f1c0: 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  S );.#ifdef SQLI
f1d0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
f1e0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
f1f0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
f200: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
f210: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
f220: 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  t( iCol==XN_ROWI
f230: 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  D || (iCol>=0 &&
f240: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
f250: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
f260: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
f270: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
f280: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
f290: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
f2a0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
f2b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
f2c0: 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  OrigCol = pTab->
f2d0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
f2e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
f2f0: 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  e = sqlite3Colum
f300: 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f  nType(&pTab->aCo
f310: 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20  l[iCol],0);.    
f320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
f330: 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  rigTab = pTab->z
f340: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
f350: 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26  ( pNC->pParse &&
f360: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
f370: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
f380: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
f390: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
f3a0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f3b0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
f3c0: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
f3d0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
f3e0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
f3f0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
f400: 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73 73 65  lse.        asse
f410: 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  rt( iCol==XN_ROW
f420: 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  ID || (iCol>=0 &
f430: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
f440: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
f450: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
f460: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
f470: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
f480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f490: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
f4a0: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61  3ColumnType(&pTa
f4b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29  b->aCol[iCol],0)
f4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
f4d0: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
f4e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
f4f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f500: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
f510: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
f520: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
f530: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
f540: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
f550: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
f560: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
f570: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
f580: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
f590: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
f5a0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
f5b0: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
f5c0: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
f5d0: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
f5e0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
f5f0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
f600: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
f610: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
f620: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
f630: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
f640: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
f650: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
f660: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
f670: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
f680: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
f690: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
f6a0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
f6b0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
f6c0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
f6d0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
f6e0: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
f6f0: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
f700: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  ol); .      brea
f710: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
f720: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
f730: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
f740: 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66  _METADATA  .  if
f750: 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20  ( pzOrigDb ){.  
f760: 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67    assert( pzOrig
f770: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c  Tab && pzOrigCol
f780: 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44   );.    *pzOrigD
f790: 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20  b = zOrigDb;.   
f7a0: 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f   *pzOrigTab = zO
f7b0: 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f  rigTab;.    *pzO
f7c0: 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f  rigCol = zOrigCo
f7d0: 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  l;.  }.#endif.  
f7e0: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
f7f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
f800: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
f810: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
f820: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
f830: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
f840: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
f850: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
f860: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
f870: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
f880: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
f890: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
f8a0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
f8b0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
f8c0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
f8d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
f8e0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
f8f0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
f900: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
f910: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f920: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
f930: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
f940: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
f950: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
f960: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
f970: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
f980: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
f990: 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65  Parse;.  sNC.pNe
f9a0: 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  xt = 0;.  for(i=
f9b0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
f9c0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
f9d0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
f9e0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
f9f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
fa00: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
fa10: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
fa20: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
fa30: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
fa40: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
fa50: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
fa60: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
fa70: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
fa80: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
fa90: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
faa0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
fab0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
fac0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
fad0: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
fae0: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
faf0: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
fb00: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
fb10: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
fb20: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
fb30: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
fb40: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
fb50: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
fb60: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
fb70: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
fb80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
fb90: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
fba0: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
fbb0: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
fbc0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
fbd0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fbe0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fbf0: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
fc00: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
fc10: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
fc20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
fc30: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
fc40: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
fc50: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
fc60: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
fc70: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
fc80: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b  NC, p, 0, 0, 0);
fc90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
fca0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fcb0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fcc0: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
fcd0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
fce0: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
fcf0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
fd00: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29  E_OMIT_DECLTYPE)
fd10: 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.}.../*.** Co
fd20: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
fd30: 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c   names for a SEL
fd40: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
fd50: 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75  *.** The only gu
fd60: 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c  arantee that SQL
fd70: 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20  ite makes about 
fd80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20  column names is 
fd90: 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63  that if the.** c
fda0: 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20  olumn has an AS 
fdb0: 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67  clause assigning
fdc0: 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74   it a name, that
fdd0: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d   will be the nam
fde0: 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20  e used..** That 
fdf0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75  is the only docu
fe00: 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65  mented guarantee
fe10: 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e  .  However, coun
fe20: 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f  tless applicatio
fe30: 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20  ns.** developed 
fe40: 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68  over the years h
fe50: 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73  ave made baseles
fe60: 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62  s assumptions ab
fe70: 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  out column names
fe80: 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65  .** and will bre
fe90: 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75  ak if those assu
fea0: 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e  mptions changes.
feb0: 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74    Hence, use ext
fec0: 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20  reme caution.** 
fed0: 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  when modifying t
fee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61  his routine to a
fef0: 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65  void breaking le
ff00: 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  gacy..**.** See 
ff10: 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c  Also: sqlite3Col
ff20: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
ff30: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41  ().**.** The PRA
ff40: 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e  GMA short_column
ff50: 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d  _names and PRAGM
ff60: 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61  A full_column_na
ff70: 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61 72 65  mes settings are
ff80: 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20  .** deprecated. 
ff90: 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 65 74   The default set
ffa0: 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e  ting is short=ON
ffb0: 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e  , full=OFF.  99.
ffc0: 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70  9% of all.** app
ffd0: 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64  lications should
ffe0: 20 6f 70 65 72 61 74 65 20 74 68 69 73 20 77 61   operate this wa
fff0: 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  y.  Nevertheless
10000 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70  , we need to sup
10010 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65  port the.** othe
10020 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61  r modes for lega
10030 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f  cy:.**.**    sho
10040 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46  rt=OFF, full=OFF
10050 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61  :      Column na
10060 6d 65 20 69 73 20 74 68 65 20 74 65 78 74 20 6f  me is the text o
10070 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10080 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20   has it.**      
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c          original
100b0 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  ly appears in th
100c0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
100d0 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20  nt.  In.**      
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f          other wo
10100 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f  rds, the zSpan o
10110 66 20 74 68 65 20 72 65 73 75 6c 74 20 65 78 70  f the result exp
10120 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
10130 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c    short=ON, full
10140 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68 69  =OFF:       (Thi
10150 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
10160 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74   setting).  If t
10170 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72 73            refers
101a0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74   directly to a t
101b0 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  able column, the
101c0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c        result col
101f0 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74  umn name is just
10200 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
10210 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20    name: COLUMN. 
10240 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a   Otherwise use z
10250 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66  Span..**.**    f
10260 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e  ull=ON, short=AN
10270 59 3a 20 20 20 20 20 20 20 49 66 20 74 68 65 20  Y:       If the 
10280 72 65 73 75 6c 74 20 72 65 66 65 72 73 20 64 69  result refers di
10290 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c  rectly to a tabl
102a0 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20  e column,.**    
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 20 20 20 74 68 65 6e 20 74            then t
102d0 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
102e0 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 74   name with the t
102f0 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20  able name.**    
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
10320 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55  , ex: TABLE.COLU
10330 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75  MN.  Otherwise u
10340 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61  se zSpan..*/.sta
10350 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
10360 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
10370 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10380 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
10390 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
103a0 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f  t *pSelect     /
103b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d  * Generate colum
103c0 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  n names for this
103d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
103e0 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
103f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10400 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61  e;.  int i;.  Ta
10410 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63  ble *pTab;.  Src
10420 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
10430 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
10440 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
10450 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10460 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20    int fullName; 
10470 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55     /* TABLE.COLU
10480 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75  MN if no AS clau
10490 73 65 20 61 6e 64 20 69 73 20 61 20 64 69 72 65  se and is a dire
104a0 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a  ct table ref */.
104b0 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20    int srcName;  
104c0 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20     /* COLUMN or 
104d0 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20  TABLE.COLUMN if 
104e0 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64  no AS clause and
104f0 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23   is direct */..#
10500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10510 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
10520 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
10530 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
10540 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
10550 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
10560 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
10570 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
10580 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
10590 53 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Set ) return;.  
105a0 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
105b0 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62  are determined b
105c0 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  y the left-most 
105d0 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75  term of a compou
105e0 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77  nd select */.  w
105f0 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
10600 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
10610 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
10620 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  r;.  SELECTTRACE
10630 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63  (1,pParse,pSelec
10640 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63  t,("generating c
10650 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29  olumn names\n"))
10660 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
10670 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
10680 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
10690 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
106a0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
106b0 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d  sert( pTabList!=
106c0 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  0 );.  pParse->c
106d0 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
106e0 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62    fullName = (db
106f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
10700 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
10710 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28  0;.  srcName = (
10720 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10730 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
10740 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65  )!=0 || fullName
10750 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
10760 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
10770 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
10780 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
10790 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
107a0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
107b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
107c0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 21  ..    assert( p!
107d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
107e0 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  ( p->op!=TK_AGG_
107f0 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67  COLUMN );  /* Ag
10800 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73  g processing has
10810 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a   not run yet */.
10820 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
10830 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
10840 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a  p->pTab!=0 ); /*
10850 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f   Covering idx no
10860 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20  t yet coded */. 
10870 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
10880 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
10890 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75     /* An AS clau
108a0 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20  se always takes 
108b0 66 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a  first priority *
108c0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  /.      char *zN
108d0 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
108e0 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
108f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
10900 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
10910 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
10920 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
10930 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
10940 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e  ( srcName && p->
10950 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
10960 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
10970 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
10980 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
10990 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e        pTab = p->
109a0 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65  pTab;.      asse
109b0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
109c0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
109d0 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
109e0 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
109f0 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
10a00 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
10a10 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
10a20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
10a30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
10a40 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
10a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10a60 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
10a70 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
10a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10a90 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( fullName ){.  
10aa0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
10ab0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
10ac0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
10ad0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
10ae0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
10af0 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
10b00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10b10 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10b20 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
10b30 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
10b40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b60 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
10b70 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
10b80 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
10b90 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
10ba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10bb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
10bc0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
10bd0 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
10be0 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
10bf0 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
10c00 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
10c10 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
10c20 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
10c30 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10c40 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
10c50 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
10c60 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
10c70 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
10c80 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
10c90 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
10ca0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
10cb0 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
10cc0 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
10cd0 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
10ce0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
10cf0 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
10d00 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
10d10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10d20 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
10d30 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
10d40 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
10d50 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
10d60 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
10d70 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
10d80 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
10d90 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
10da0 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
10db0 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
10dc0 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
10dd0 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
10de0 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
10df0 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
10e00 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
10e10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
10e20 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10e30 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
10e40 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
10e50 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
10e60 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
10e70 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
10e80 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
10e90 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54  E_NOMEM..**.** T
10ea0 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  he only guarante
10eb0 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61  e that SQLite ma
10ec0 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  kes about column
10ed0 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69   names is that i
10ee0 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
10ef0 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65  has an AS clause
10f00 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
10f10 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20  name, that will 
10f20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64  be the name used
10f30 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65  ..** That is the
10f40 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64   only documented
10f50 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77   guarantee.  How
10f60 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20  ever, countless 
10f70 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20  applications.** 
10f80 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74  developed over t
10f90 68 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61  he years have ma
10fa0 64 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75  de baseless assu
10fb0 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f  mptions about co
10fc0 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e  lumn names.** an
10fd0 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20  d will break if 
10fe0 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e  those assumption
10ff0 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63  s changes.  Henc
11000 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63  e, use extreme c
11010 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d  aution.** when m
11020 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f  odifying this ro
11030 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62  utine to avoid b
11040 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a  reaking legacy..
11050 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20  **.** See Also: 
11060 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
11070 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mes().*/.int sql
11080 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
11090 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
110a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
110b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
110c0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
110d0 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
110e0 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20     /* Expr list 
110f0 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65  from which to de
11100 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rive column name
11110 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f  s */.  i16 *pnCo
11120 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11130 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
11140 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65  er of columns he
11150 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  re */.  Column *
11160 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20  *paCol          
11170 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
11180 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72   column list her
11190 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
111a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
111b0 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
111c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
111d0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
111f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
11200 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20  /.  u32 cnt;    
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74  /* Index added t
11230 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20  o make the name 
11240 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75  unique */.  Colu
11250 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
11260 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
11270 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75  ooping over resu
11280 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
11290 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
112a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
112b0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
112c0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
112d0 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  et */.  char *zN
112e0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
112f0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
11300 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
11310 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11320 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
11330 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
11340 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20  /.  Hash ht;    
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11360 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66  /* Hash table of
11370 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
11380 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ..  sqlite3HashI
11390 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20  nit(&ht);.  if( 
113a0 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
113b0 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
113c0 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
113d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
113e0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
113f0 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
11400 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
11410 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==0 );.    if( n
11420 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c  Col>32767 ) nCol
11430 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73   = 32767;.  }els
11440 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  e{.    nCol = 0;
11450 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20  .    aCol = 0;. 
11460 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
11470 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a  l==(i16)nCol );.
11480 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
11490 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
114a0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
114b0 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20  ol=aCol; i<nCol 
114c0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
114d0 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  iled; i++, pCol+
114e0 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
114f0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
11500 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
11510 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
11520 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
11530 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
11540 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
11550 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
11560 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
11570 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
11580 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
11590 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
115a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
115b0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
115c0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
115d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
115e0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
115f0 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11600 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
11610 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45  pColExpr = pColE
11620 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
11630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
11640 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  lExpr!=0 );.    
11650 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
11660 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d  ( pColExpr->op!=
11670 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
11680 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
11690 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
116a0 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  MN ){.        /*
116b0 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65   For columns use
116c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
116d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
116e0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c   int iCol = pCol
116f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
11700 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
11710 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
11720 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tab;.        ass
11730 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
11740 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
11750 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
11760 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
11770 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30   zName = iCol>=0
11780 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
11790 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
117a0 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
117b0 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
117c0 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
117d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
117e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
117f0 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
11800 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
11810 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Name = pColExpr-
11820 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
11830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11840 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
11850 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
11860 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
11870 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
11880 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
11890 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
118a0 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pan;.      }.   
118b0 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65   }.    if( zName
118c0 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   ){.      zName 
118d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
118e0 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
118f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
11900 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
11910 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e  rintf(db,"column
11920 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a  %d",i+1);.    }.
11930 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
11940 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
11950 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66  e is unique.  If
11960 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74   the name is not
11970 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20   unique,.    ** 
11980 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65  append an intege
11990 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
119a0 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
119b0 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
119c0 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
119d0 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26   while( zName &&
119e0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
119f0 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20  (&ht, zName)!=0 
11a00 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  ){.      nName =
11a10 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11a20 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  (zName);.      i
11a30 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20  f( nName>0 ){.  
11a40 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d        for(j=nNam
11a50 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69  e-1; j>0 && sqli
11a60 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65  te3Isdigit(zName
11a70 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20  [j]); j--){}.   
11a80 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a       if( zName[j
11a90 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d  ]==':' ) nName =
11aa0 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
11ab0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
11ac0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e  3MPrintf(db, "%.
11ad0 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a  *z:%u", nName, z
11ae0 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
11af0 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20      if( cnt>3 ) 
11b00 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
11b10 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20  ss(sizeof(cnt), 
11b20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &cnt);.    }.   
11b30 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
11b40 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
11b50 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
11b60 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f  sFromName(0, pCo
11b70 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  l);.    if( zNam
11b80 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68  e && sqlite3Hash
11b90 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d  Insert(&ht, zNam
11ba0 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29  e, pCol)==pCol )
11bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
11bc0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
11bd0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11be0 48 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a  HashClear(&ht);.
11bf0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11c00 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
11c10 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
11c20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11c30 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
11c40 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
11c50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11c60 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
11c70 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
11c80 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
11c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11ca0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
11cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11cc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
11cd0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
11ce0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  on information t
11cf0 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  o a column list 
11d00 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45  based on.** a SE
11d10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
11d20 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ** .** The colum
11d30 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c  n list presumabl
11d40 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65  y came from sele
11d50 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f  ctColumnNamesFro
11d60 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20  mExprList()..** 
11d70 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
11d80 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20  has only names, 
11d90 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c  not types or col
11da0 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a  lations.  This.*
11db0 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  * routine goes t
11dc0 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20  hrough and adds 
11dd0 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  the types and co
11de0 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  llations..**.** 
11df0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71  This routine req
11e00 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69  uires that all i
11e10 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
11e20 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  e SELECT.** stat
11e30 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65  ement be resolve
11e40 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
11e50 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
11e60 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
11e70 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
11e80 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
11e90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a  rsing contexts *
11ea0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
11eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
11ec0 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66   column type inf
11ed0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
11ee0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
11ef0 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
11f00 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
11f10 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
11f20 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
11f30 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
11f40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11f50 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
11f60 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
11f70 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
11f80 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
11f90 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
11fa0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11fb0 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
11fc0 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
11fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
11fe0 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
11ff0 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
12000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
12010 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
12020 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
12030 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12040 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
12050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12060 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
12070 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
12080 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
12090 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
120a0 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
120b0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
120c0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
120d0 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
120e0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
120f0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63  , pCol++){.    c
12100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
12110 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a  ;.    int n, m;.
12120 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
12130 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  pr;.    zType = 
12140 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
12150 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   p, 0, 0, 0);.  
12160 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74    /* pCol->szEst
12170 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e   = ... // Column
12180 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45   size est for SE
12190 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65  LECT tables neve
121a0 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43  r used */.    pC
121b0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
121c0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
121d0 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
121e0 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20  Type ){.      m 
121f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12200 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  0(zType);.      
12210 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
12220 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
12230 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
12240 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
12250 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
12260 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
12270 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
12280 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
12290 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
122a0 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
122b0 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
122c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
122d0 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
122e0 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
122f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12300 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
12310 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
12320 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
12330 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  LOB;.    pColl =
12340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
12350 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
12360 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
12370 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20   pCol->zColl==0 
12380 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
12390 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
123a0 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
123b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
123c0 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61    }.  pTab->szTa
123d0 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79  bRow = 1; /* Any
123e0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
123f0 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  works */.}../*.*
12400 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
12410 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
12420 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
12430 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
12440 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
12450 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
12460 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
12470 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
12480 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
12490 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
124a0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
124b0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
124c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
124d0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
124e0 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
124f0 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
12500 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
12510 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
12520 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
12530 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
12540 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
12550 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
12560 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
12570 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
12580 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
12590 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
125a0 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
125b0 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
125c0 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
125d0 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
125e0 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
125f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12600 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
12610 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
12620 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
12630 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
12640 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
12650 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
12660 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
12670 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
12680 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
12690 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
126a0 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
126b0 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
126c0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
126d0 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
126e0 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
126f0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
12700 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
12710 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
12720 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  576) );.  sqlite
12730 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
12740 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
12750 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
12760 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
12770 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
12780 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
12790 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
127a0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
127b0 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
127c0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
127d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
127e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
127f0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
12800 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
12810 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
12820 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
12830 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
12840 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
12850 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
12860 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
12870 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
12880 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12890 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
128a0 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
128b0 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
128c0 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
128d0 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
128e0 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
128f0 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
12900 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
12910 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66  >pVdbe;.  }.  if
12920 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
12930 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  vel==0.   && Opt
12940 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
12950 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49  (pParse->db,SQLI
12960 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
12970 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72  t).  ){.    pPar
12980 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
12990 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  r = 1;.  }.  ret
129a0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43  urn sqlite3VdbeC
129b0 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d  reate(pParse);.}
129c0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
129d0 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
129e0 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
129f0 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
12a00 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
12a10 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  mit expressions.
12a20 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20    pLimit->pLeft 
12a30 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  and pLimit->pRig
12a40 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ht hold the expr
12a50 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
12a60 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
12a70 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
12a80 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
12a90 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
12aa0 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
12ab0 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
12ac0 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
12ad0 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
12ae0 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
12af0 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
12b00 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
12b10 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
12b20 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
12b30 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
12b40 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
12b50 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
12b60 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
12b70 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
12b80 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
12b90 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
12ba0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
12bb0 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
12bc0 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
12bd0 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
12be0 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
12bf0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
12c00 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
12c10 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
12c20 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e  t.  iLimit.** an
12c30 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  d iOffset should
12c40 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
12c50 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
12c60 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
12c70 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
12c80 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
12c90 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
12ca0 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
12cb0 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
12cc0 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
12cd0 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
12ce0 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
12cf0 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
12d00 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
12d10 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
12d20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
12d30 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
12d40 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
12d50 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
12d60 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66   if pLimit->pLef
12d70 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
12d80 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
12d90 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
12da0 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
12db0 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
12dc0 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
12dd0 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
12de0 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
12df0 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
12e00 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
12e10 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
12e20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
12e30 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
12e40 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
12e50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12e60 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
12e70 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
12e80 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
12e90 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
12ea0 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b  Offset;.  int n;
12eb0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20  .  Expr *pLimit 
12ec0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20  = p->pLimit;..  
12ed0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
12ee0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
12ef0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
12f00 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
12f10 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
12f20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
12f30 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
12f40 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
12f50 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
12f60 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
12f70 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
12f80 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
12f90 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
12fa0 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
12fb0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
12fc0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
12fd0 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29  ;.  if( pLimit )
12fe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
12ff0 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d  imit->op==TK_LIM
13000 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  IT );.    assert
13010 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  ( pLimit->pLeft!
13020 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69  =0 );.    p->iLi
13030 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
13040 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
13050 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
13060 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13070 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20     assert( v!=0 
13080 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
13090 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
130a0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26  pLimit->pLeft, &
130b0 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
130c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
130d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
130e0 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
130f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13100 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
13110 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
13120 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13130 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69  te3VdbeGoto(v, i
13140 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
13150 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20  lse if( n>=0 && 
13160 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71  p->nSelectRow>sq
13170 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
13180 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )n) ){.        p
13190 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
131a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
131b0 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  4)n);.        p-
131c0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
131d0 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20  FixedLimit;.    
131e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
131f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13200 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
13210 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d  mit->pLeft, iLim
13220 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
13230 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13240 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
13250 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
13260 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
13270 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13280 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
13290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
132a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
132b0 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42  fNot, iLimit, iB
132c0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
132d0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
132e0 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52    if( pLimit->pR
132f0 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  ight ){.      p-
13300 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
13310 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
13320 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
13330 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
13340 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
13350 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
13360 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
13370 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13380 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
13390 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66  mit->pRight, iOf
133a0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
133b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
133c0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
133d0 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
133e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
133f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13400 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
13410 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
13420 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13430 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20  OP_OffsetLimit, 
13440 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b  iLimit, iOffset+
13450 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  1, iOffset);.   
13460 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
13470 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
13480 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  "));.    }.  }.}
13490 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
134a0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
134b0 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
134c0 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
134d0 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
134e0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
134f0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
13500 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
13510 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
13520 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
13530 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
13540 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
13550 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
13560 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
13570 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
13580 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
13590 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
135a0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
135b0 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
135c0 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
135d0 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
135e0 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
135f0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
13600 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
13610 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
13620 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
13630 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
13640 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
13650 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
13660 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
13670 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
13680 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
13690 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
136a0 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
136b0 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
136c0 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
136d0 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c  >=0 );.  /* iCol
136e0 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68   must be less th
136f0 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  an p->pEList->nE
13700 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20  xpr.  Otherwise 
13710 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20  an error would. 
13720 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68   ** have been th
13730 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65  rown during name
13740 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20   resolution and 
13750 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76  we would not hav
13760 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68  e gotten.  ** th
13770 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20  is far */.  if( 
13780 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59  pRet==0 && ALWAY
13790 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  S(iCol<p->pEList
137a0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
137b0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
137c0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
137d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
137e0 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
137f0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13800 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
13810 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
13820 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
13830 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
13840 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
13850 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44  T.** with an ORD
13860 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68  ER BY clause. Th
13870 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
13880 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
13890 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73  s a KeyInfo.** s
138a0 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c  tructure suitabl
138b0 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
138c0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
138d0 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
138e0 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
138f0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
13900 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
13910 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  oc. The calling.
13920 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
13930 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
13940 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69  nsuring that thi
13950 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
13960 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
13970 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
13980 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65  yInfo *multiSele
13990 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
139a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
139b0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e  Select *p, int n
139c0 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69  Extra){.  ExprLi
139d0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
139e0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
139f0 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t nOrderBy = p->
13a00 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13a10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13a20 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
13a30 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73  eyInfo *pRet = s
13a40 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
13a50 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b  oc(db, nOrderBy+
13a60 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66  nExtra, 1);.  if
13a70 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( pRet ){.    in
13a80 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
13a90 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
13aa0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
13ab0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
13ac0 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42  pItem = &pOrderB
13ad0 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45  y->a[i];.      E
13ae0 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74  xpr *pTerm = pIt
13af0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
13b00 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
13b10 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ..      if( pTer
13b20 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
13b30 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
13b40 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13b50 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13b60 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  se, pTerm);.    
13b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13b80 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
13b90 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13ba0 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e  se, p, pItem->u.
13bb0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29  x.iOrderByCol-1)
13bc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
13bd0 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
13be0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
13bf0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
13c00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20  ->a[i].pExpr =. 
13c10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13c20 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
13c30 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
13c40 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
13c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13c60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13c70 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
13c80 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20  le(pRet) );.    
13c90 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d    pRet->aColl[i]
13ca0 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
13cb0 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pRet->aSortOrder
13cc0 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
13cd0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
13ce0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
13cf0 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
13d00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d10 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _CTE./*.** This 
13d20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
13d30 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63  s VDBE code to c
13d40 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65  ompute the conte
13d50 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43  nt of a WITH REC
13d60 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20  URSIVE.** query 
13d70 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
13d80 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d  **   <recursive-
13d90 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75  table> AS (<setu
13da0 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b  p-query> UNION [
13db0 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d  ALL] <recursive-
13dc0 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20  query>).**      
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f     \___________/
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
13e00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
13e10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13e20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
13e30 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
13e40 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a             p.**.
13e50 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65  **.** There is e
13e60 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72  xactly one refer
13e70 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75  ence to the recu
13e80 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74  rsive-table in t
13e90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  he FROM clause.*
13ea0 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71  * of recursive-q
13eb0 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74  uery, marked wit
13ec0 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61  h the SrcList->a
13ed0 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  [].fg.isRecursiv
13ee0 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
13ef0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
13f00 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
13f10 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
13f20 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
13f30 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
13f40 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
13f50 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
13f60 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
13f70 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
13f80 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
13f90 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
13fa0 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
13fb0 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
13fc0 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
13fd0 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
13fe0 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
13ff0 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
14000 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
14010 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
14020 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
14030 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
14040 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
14050 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
14060 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
14070 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
14080 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
14090 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
140a0 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
140b0 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
140c0 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
140d0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
140e0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
140f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
14100 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
14110 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
14120 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
14130 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
14140 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
14150 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
14160 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
14170 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
14180 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
14190 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
141a0 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
141b0 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
141c0 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
141d0 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
141e0 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
141f0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
14200 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
14210 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
14220 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
14230 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
14240 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
14250 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
14260 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
14270 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
14280 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
14290 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
142a0 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
142b0 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
142c0 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
142d0 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
142e0 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
142f0 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
14300 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
14310 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
14320 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
14330 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
14340 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
14350 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
14360 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
14370 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
14380 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
14390 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
143a0 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
143b0 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
143c0 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
143d0 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
143e0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
143f0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
14400 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
14410 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
14420 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
14430 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
14440 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
14450 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
14460 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
14470 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
14480 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
14490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
144a0 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
144b0 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
144c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
144d0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
144e0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
144f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
14500 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
14510 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
14520 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
14530 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
14540 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
14550 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
14560 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
14570 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
14580 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
14590 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
145a0 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
145b0 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
145c0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
145d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
145e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
145f0 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
14600 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
14610 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
14620 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
14630 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
14640 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
14650 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
14660 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
14670 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
14680 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
14690 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
146a0 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
146b0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
146c0 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
146d0 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
146e0 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
146f0 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
14700 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
14710 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14720 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
14730 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
14740 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
14750 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
14760 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
14770 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
14780 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
147a0 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
147b0 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
147c0 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
147d0 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
147e0 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
147f0 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
14800 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
14810 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
14820 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
14830 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
14840 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
14850 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
14860 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
14870 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
14880 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
148b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
148e0 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
148f0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
14900 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
14910 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
14920 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
14930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14940 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
14950 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
14960 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
14970 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
14980 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
14990 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
149a0 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
149b0 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
149c0 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
149d0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
149e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
149f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
14a00 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
14a10 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14a20 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
14a30 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
14a40 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
14a50 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
14a60 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
14a70 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14a80 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
14a90 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
14aa0 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
14ab0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
14ac0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14ad0 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29  e, p, addrBreak)
14ae0 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  ;.  pLimit = p->
14af0 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d  pLimit;.  regLim
14b00 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
14b10 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
14b20 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
14b30 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  Limit = 0;.  p->
14b40 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
14b50 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
14b60 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
14b70 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
14b80 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
14b90 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
14ba0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
14bb0 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
14bc0 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
14bd0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
14be0 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
14bf0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
14c00 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
14c10 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
14c20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14c30 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
14c40 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
14c50 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
14c60 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
14c70 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
14c80 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
14c90 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
14ca0 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
14cb0 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
14cc0 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
14cd0 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
14ce0 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
14cf0 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
14d00 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
14d10 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
14d20 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
14d30 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14d40 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
14d50 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
14d60 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
14d70 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
14d80 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
14d90 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
14da0 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
14db0 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
14dc0 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
14dd0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14de0 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
14df0 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
14e00 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
14e10 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
14e20 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
14e30 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
14e40 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
14e50 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14e70 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
14e80 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
14e90 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
14ea0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
14eb0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
14ec0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
14ed0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
14ee0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
14ef0 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
14f00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14f10 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14f20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
14f30 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
14f60 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
14f70 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
14f80 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
14f90 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
14fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14fb0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14fc0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
14fd0 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
14fe0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
14ff0 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
15000 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
15010 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
15020 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
15030 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15040 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15050 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
15060 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
15070 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
15080 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
15090 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
150a0 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
150b0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
150c0 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
150d0 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
150e0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
150f0 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
15100 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
15110 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
15120 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e  t = 0;.  Explain
15130 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15140 65 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b  e, 1, "SETUP"));
15150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
15160 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
15170 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65  etup, &destQueue
15180 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  );.  pSetup->pNe
15190 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63  xt = p;.  if( rc
151a0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72   ) goto end_of_r
151b0 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a  ecursive_query;.
151c0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
151d0 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51  ext row in the Q
151e0 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20  ueue and output 
151f0 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64  that row */.  ad
15200 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
15210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15220 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20  Rewind, iQueue, 
15230 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
15240 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
15250 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
15260 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75  next row in Queu
15270 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e  e over to Curren
15280 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  t */.  sqlite3Vd
15290 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
152a0 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74  ullRow, iCurrent
152b0 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63  ); /* To reset c
152c0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20  olumn cache */. 
152d0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
152e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
152f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
15300 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  umn, iQueue, pOr
15310 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
15320 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
15330 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15340 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15350 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75  P_RowData, iQueu
15360 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  e, regCurrent);.
15370 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15380 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
15390 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a  lete, iQueue);..
153a0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
153b0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
153c0 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43  rrent */.  addrC
153d0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
153e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
153f0 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72   codeOffset(v, r
15400 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  egOffset, addrCo
15410 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  nt);.  selectInn
15420 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
15430 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20  , iCurrent,.    
15440 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61    0, 0, pDest, a
15450 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
15460 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69  ak);.  if( regLi
15470 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
15480 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15490 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
154a0 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42   regLimit, addrB
154b0 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
154c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
154d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
154e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
154f0 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78  rCont);..  /* Ex
15500 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73  ecute the recurs
15510 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e  ive SELECT takin
15520 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  g the single row
15530 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20   in Current as. 
15540 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f   ** the value fo
15550 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  r the recursive-
15560 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65  table. Store the
15570 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
15580 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  Queue..  */.  if
15590 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
155a0 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
155b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
155c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65 63  Msg(pParse, "rec
155d0 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74 65  ursive aggregate
155e0 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70   queries not sup
155f0 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73  ported");.  }els
15600 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  e{.    p->pPrior
15610 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69   = 0;.    Explai
15620 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
15630 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56  se, 1, "RECURSIV
15640 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73  E STEP"));.    s
15650 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15660 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
15670 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ue);.    assert(
15680 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
15690 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
156a0 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20   pSetup;.  }..  
156b0 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
156c0 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
156d0 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
156e0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
156f0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
15700 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
15710 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15720 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
15730 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
15740 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
15750 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
15760 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
15770 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
15780 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
15790 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
157a0 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e  pLimit;.  return
157b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
157c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
157d0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
157e0 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
157f0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
15800 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
15810 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15820 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15830 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
15840 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15850 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
15860 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
15870 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
15880 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
15890 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
158a0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
158b0 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ults */.);../*.*
158c0 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65  * Handle the spe
158d0 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63  cial case of a c
158e0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
158f0 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  hat originates f
15900 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20  rom a.** VALUES 
15910 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64  clause.  By hand
15920 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  ling this as a s
15930 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20  pecial case, we 
15940 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65  avoid deep.** re
15950 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75  cursion, and thu
15960 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s do not need to
15970 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c   enforce the SQL
15980 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
15990 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20  ND_SELECT.** on 
159a0 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
159b0 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74  .**.** Because t
159c0 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
159d0 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
159e0 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
159f0 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65  :.**   (1) There
15a00 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20   is no LIMIT or 
15a10 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74  OFFSET or else t
15a20 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20  here is a LIMIT 
15a30 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20  of exactly 1.** 
15a40 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
15a50 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
15a60 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
15a70 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
15a80 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49  se.**.** The "LI
15a90 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31  MIT of exactly 1
15aa0 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74  " case of condit
15ab0 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62  ion (1) comes ab
15ac0 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45  out when a VALUE
15ad0 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75  S.** clause occu
15ae0 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72  rs within scalar
15af0 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a   expression (ex:
15b00 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53   "SELECT (VALUES
15b10 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a  (1),(2),(3))")..
15b20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f  ** The sqlite3Co
15b30 64 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c  deSubselect will
15b40 20 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20   have added the 
15b50 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69  LIMIT 1 clause i
15b60 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53  n tht case..** S
15b70 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69  ince the limit i
15b80 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20  s exactly 1, we 
15b90 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61  only need to eva
15ba0 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d  lutes the left-m
15bb0 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73  ost VALUES..*/.s
15bc0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
15bd0 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50  electValues(.  P
15be0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15bf0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15c00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
15c10 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
15c20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
15c30 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
15c40 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
15c50 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
15c60 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
15c70 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
15c80 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
15c90 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20  int nRow = 1;.  
15ca0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e  int rc = 0;.  in
15cb0 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e  t bShowAll = p->
15cc0 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73  pLimit==0;.  ass
15cd0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
15ce0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
15cf0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
15d00 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
15d10 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
15d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15d30 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
15d40 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
15d50 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
15d60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15d70 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  p->pNext==0 || p
15d80 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
15d90 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73  =p->pNext->pELis
15da0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
15db0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
15dc0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
15dd0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d  sert( p->pPrior-
15de0 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20  >pNext==p );.   
15df0 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
15e00 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f      nRow += bSho
15e10 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31  wAll;.  }while(1
15e20 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  );.  ExplainQuer
15e30 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
15e40 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54  , "SCAN %d CONST
15e50 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77  ANT ROW%s", nRow
15e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15e70 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20        nRow==1 ? 
15e80 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68  "" : "S"));.  wh
15e90 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65  ile( p ){.    se
15ea0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
15eb0 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20  arse, p, -1, 0, 
15ec0 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b  0, pDest, 1, 1);
15ed0 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f 77 41  .    if( !bShowA
15ee0 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll ) break;.    
15ef0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
15f00 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
15f10 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
15f20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15f30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15f40 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
15f50 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
15f60 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
15f70 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
15f80 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
15f90 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
15fa0 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
15fb0 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
15fc0 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
15fd0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
15fe0 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
15ff0 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
16000 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
16010 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
16020 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
16030 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
16040 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
16050 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
16060 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
16070 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
16080 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
16090 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
160a0 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
160b0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
160c0 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
160d0 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
160e0 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
160f0 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
16100 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
16110 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
16120 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
16130 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
16140 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
16150 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
16160 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
16170 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
16180 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
16190 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
161a0 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
161b0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
161c0 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
161d0 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
161e0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
161f0 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
16200 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
16210 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
16220 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
16230 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
16240 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
16250 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
16260 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
16270 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
16280 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
16290 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
162a0 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
162b0 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
162c0 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
162d0 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
162e0 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
162f0 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
16300 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
16310 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
16320 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
16330 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
16340 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
16350 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
16360 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
16370 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
16380 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
16390 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
163a0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
163b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
163c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
163d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
163e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
163f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
16400 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
16410 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
16420 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
16430 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
16440 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
16450 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16460 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
16470 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
16480 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
16490 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
164a0 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
164b0 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
164c0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
164d0 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
164e0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
164f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16500 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
16510 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
16520 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
16530 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
16540 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
16550 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
16560 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
16570 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
16580 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
16590 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
165a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
165b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
165c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
165d0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
165e0 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
165f0 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
16600 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
16610 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
16620 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
16630 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
16640 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
16650 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
16660 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
16670 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
16680 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
16690 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
166a0 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
166b0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
166c0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
166d0 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  =0 || p->op==TK_
166e0 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ALL || p->op==TK
166f0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d  _UNION );.  db =
16700 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
16710 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
16720 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65  r;.  dest = *pDe
16730 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  st;.  if( pPrior
16740 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50  ->pOrderBy || pP
16750 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
16760 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16770 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63  Msg(pParse,"%s c
16780 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
16790 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
167a0 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50  efore",.      pP
167b0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d  rior->pOrderBy!=
167c0 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a  0 ? "ORDER BY" :
167d0 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74   "LIMIT", select
167e0 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
167f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
16800 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
16810 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
16820 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16830 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
16840 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
16850 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
16860 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
16870 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
16880 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
16890 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
168a0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
168b0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
168c0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
168d0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
168e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
168f0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
16900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16910 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
16920 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72  ral, dest.iSDPar
16930 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
16940 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  xpr);.    dest.e
16950 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
16960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
16970 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72  ial handling for
16980 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
16990 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
169a0 65 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63  es as a VALUES c
169b0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
169c0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
169d0 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b  SF_MultiValue ){
169e0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
169f0 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72  electValues(pPar
16a00 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
16a10 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16a20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
16a30 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
16a40 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
16a50 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
16a60 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16a70 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
16a80 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
16a90 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
16aa0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
16ab0 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
16ac0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
16ad0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
16ae0 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
16af0 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64  >nExpr );..#ifnd
16b00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
16b10 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  TE.  if( p->selF
16b20 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
16b30 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ive ){.    gener
16b40 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
16b50 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
16b60 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   &dest);.  }else
16b70 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
16b80 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
16b90 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
16ba0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
16bb0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
16bc0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
16bd0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
16be0 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
16bf0 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
16c00 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
16c10 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66   }else{..#ifndef
16c20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
16c30 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72  LAIN.    if( pPr
16c40 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
16c50 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  {.      ExplainQ
16c60 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
16c70 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51  , 1, "COMPOUND Q
16c80 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45  UERY"));.      E
16c90 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
16ca0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46  (pParse, 1, "LEF
16cb0 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22  T-MOST SUBQUERY"
16cc0 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ));.    }.#endif
16cd0 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
16ce0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
16cf0 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
16d00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
16d10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74  .    */.    swit
16d20 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
16d30 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
16d40 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
16d50 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
16d60 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
16d70 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
16d80 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
16d90 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69         pPrior->i
16da0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
16db0 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  t;.        pPrio
16dc0 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->iOffset = p->
16dd0 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  iOffset;.       
16de0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
16df0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
16e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16e10 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
16e20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
16e30 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
16e40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
16e50 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
16e60 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16e70 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
16e80 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
16e90 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
16ea0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
16eb0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
16ec0 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65         p->iOffse
16ed0 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
16ee0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
16ef0 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
16f00 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
16f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16f20 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d  (v, OP_IfNot, p-
16f30 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f  >iLimit); VdbeCo
16f40 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
16f50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
16f60 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
16f70 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
16f80 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d"));.          
16f90 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29  if( p->iOffset )
16fa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
16fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16fc0 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
16fd0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69   p->iLimit, p->i
17000 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66  Offset+1, p->iOf
17010 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fset);.         
17020 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17030 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
17040 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
17050 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b  , "UNION ALL"));
17060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17070 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17080 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
17090 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
170a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
170b0 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
170c0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
170d0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
170e0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
170f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
17100 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
17110 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
17120 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
17130 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  ctRow);.        
17140 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
17150 69 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  it.         && s
17160 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
17170 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
17180 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d  it->pLeft, &nLim
17190 69 74 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  it).         && 
171a0 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
171b0 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69  SelectRow > sqli
171c0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
171d0 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20  Limit) .        
171e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
171f0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
17200 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
17210 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  nLimit);.       
17220 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
17230 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ddr ){.         
17240 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17250 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
17260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17270 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17280 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
17290 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65  CEPT:.      case
172a0 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
172b0 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
172c0 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
172d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
172e0 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  mp table holding
172f0 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
17300 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
17310 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
17320 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
17330 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
17340 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  lf */.        in
17350 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
17360 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
17370 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
17380 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
17390 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
173a0 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61  pLimit;    /* Sa
173b0 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
173c0 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20  >nLimit  */.    
173d0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
173e0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
173f0 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20   uniondest;.  . 
17400 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17410 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
17420 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  T );.        tes
17430 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
17440 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
17450 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f    priorOp = SRT_
17460 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  Union;.        i
17470 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
17480 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
17490 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
174a0 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
174b0 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
174c0 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
174d0 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ur.          ** 
174e0 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20  right..         
174f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
17500 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
17510 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
17520 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
17530 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
17540 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f  /.          unio
17550 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50  nTab = dest.iSDP
17560 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arm;.        }el
17570 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
17580 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
17590 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
175a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
175b0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
175c0 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
175d0 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
175e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
175f0 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
17600 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17610 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17620 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
17630 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
17640 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
17650 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
17660 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
17670 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
17680 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
17690 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
176a0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
176b0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
176c0 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
176d0 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
176e0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
176f0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
17700 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
17710 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
17720 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ist );.        }
17730 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  .  .        /* C
17740 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
17750 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
17760 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f   left.        */
17770 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17780 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
17790 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  By );.        sq
177a0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
177b0 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
177c0 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
177d0 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  b);.        rc =
177e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
177f0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
17800 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
17810 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
17820 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
17830 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
17840 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
17850 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
17860 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
17870 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
17880 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
17890 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
178a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   ){.          op
178b0 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
178c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
178d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
178e0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
178f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20  );.          op 
17900 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
17910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
17920 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
17930 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
17940 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
17950 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
17960 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  .        unionde
17970 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
17980 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
17990 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
179a0 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45   1, "%s USING TE
179b0 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20  MP B-TREE",.    
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179d0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
179e0 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20  me(p->op)));.   
179f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17a00 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
17a10 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
17a20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17a30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17a40 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75  );.        /* Qu
17a50 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
17a60 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
17a70 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
17a80 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
17a90 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
17aa0 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
17ab0 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
17ac0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
17ad0 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
17ae0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
17af0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
17b00 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
17b10 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
17b20 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
17b30 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
17b40 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ior;.        p->
17b50 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
17b60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
17b70 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
17b80 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
17b90 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
17ba0 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
17bb0 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
17bc0 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
17bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
17be0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
17bf0 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
17c00 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
17c10 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
17c20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
17c30 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  0;.        p->iO
17c40 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20  ffset = 0;.  .  
17c50 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
17c60 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
17c70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17c80 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
17c90 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  orm.        ** i
17ca0 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
17cb0 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
17cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17cd0 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
17ce0 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
17cf0 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
17d00 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20  iorOp );.       
17d10 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
17d20 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
17d30 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
17d40 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
17d50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17d60 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
17d70 20 20 20 20 20 20 20 20 20 20 69 42 72 65 61 6b            iBreak
17d80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17d90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
17da0 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
17db0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17dc0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  el(v);.         
17dd0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
17de0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
17df0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
17e20 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
17e30 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
17e40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
17e50 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
17e60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17e70 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  dr(v);.         
17e80 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
17e90 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f  (pParse, p, unio
17ea0 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  nTab,.          
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
17ed0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
17ee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17ef0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17f00 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
17f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17f20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
17f30 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
17f40 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  rt); VdbeCoverag
17f50 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
17f60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17f70 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
17f80 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  k);.          sq
17f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17fa0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
17fb0 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
17fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
17fd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17fe0 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
17ff0 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
18000 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
18010 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
18020 62 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  b2;.        int 
18030 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
18040 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45  Start;.        E
18050 78 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20  xpr *pLimit;.   
18060 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
18070 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
18080 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
18090 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b  .        int r1;
180a0 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  .  .        /* I
180b0 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
180c0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
180d0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
180e0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
180f0 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
18100 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
18110 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
18120 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
18130 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
18140 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
18150 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
18160 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18170 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
18180 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
18190 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
181a0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
181b0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
181c0 42 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  By==0 );.  .    
181d0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
181e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
181f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
18200 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
18210 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
18220 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
18230 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
18240 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
18250 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
18260 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
18270 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
18280 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
18290 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
182a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
182b0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
182c0 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
182d0 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
182e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
182f0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20  "tab1"..        
18300 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
18310 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
18320 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
18330 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
18340 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
18350 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
18360 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69  arse, pPrior, &i
18370 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
18380 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
18390 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
183a0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
183b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  ;.        }.  . 
183c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
183d0 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
183e0 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
183f0 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
18400 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18410 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
18420 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18430 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
18440 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ab2, 0);.       
18450 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
18460 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d  OpenEphm[1] == -
18470 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
18480 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
18490 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
184a0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
184b0 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20         pLimit = 
184c0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
184d0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
184e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 73  ;.        inters
184f0 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20  ectdest.iSDParm 
18500 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20  = tab2;.        
18510 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
18520 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
18530 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
18540 45 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EE",.           
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18560 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
18570 70 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  p)));.        rc
18580 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
18590 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
185a0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
185b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
185c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
185d0 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20          pDelete 
185e0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
185f0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
18600 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
18610 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
18620 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
18630 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  ctRow ){.       
18640 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
18650 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
18660 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  ctRow;.        }
18670 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18680 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
18690 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
186a0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
186b0 4c 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20  Limit;.  .      
186c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
186d0 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
186e0 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
186f0 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
18700 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
18710 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
18720 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18730 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
18740 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
18750 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18760 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
18770 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
18780 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
18790 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
187a0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
187b0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
187c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
187d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
187e0 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
187f0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
18800 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18810 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
18820 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
18830 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
18840 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18850 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
18860 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  a, tab1, r1);.  
18870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18880 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18890 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
188a0 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a   iCont, r1, 0);.
188b0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
188c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
188d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
188e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
188f0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  1);.        sele
18900 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
18910 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20  se, p, tab1,.   
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
18940 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
18950 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18960 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18970 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
18980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
189a0 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
189b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
189c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
189d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
189e0 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
189f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18a00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18a10 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
18a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18a30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18a40 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
18a50 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18a70 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .  #ifndef SQLIT
18a80 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
18a90 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d     if( p->pNext=
18aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c  =0 ){.      Expl
18ab0 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28  ainQueryPlanPop(
18ac0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
18ad0 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20   #endif.  }.  . 
18ae0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
18af0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
18b00 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65  used by .  ** te
18b10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
18b20 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
18b30 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
18b40 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
18b50 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
18b60 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
18b70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
18b80 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
18b90 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
18ba0 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
18bb0 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
18bc0 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
18bd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
18be0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
18bf0 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
18c00 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
18c10 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
18c20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
18c30 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
18c40 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
18c50 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
18c60 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
18c70 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
18c80 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
18c90 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68  ags & SF_UsesEph
18ca0 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e  emeral ){.    in
18cb0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18cd0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
18ce0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
18cf0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
18d00 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
18d10 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
18d20 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
18d30 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20   Select *pLoop; 
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d50 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
18d60 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61  rough SELECT sta
18d70 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43  tements */.    C
18d80 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18da0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
18db0 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
18dc0 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  oll[] */.    int
18dd0 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
18de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18df0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
18e00 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  in result set */
18e10 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
18e20 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  >pNext==0 );.   
18e30 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
18e40 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b  t->nExpr;.    pK
18e50 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
18e60 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
18e70 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69   nCol, 1);.    i
18e80 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
18e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18ea0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
18eb0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
18ec0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
18ed0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
18ee0 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
18ef0 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
18f00 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
18f10 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
18f20 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
18f30 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
18f40 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
18f50 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
18f60 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
18f70 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
18f80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
18f90 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
18fa0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
18fb0 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
18fc0 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
18fd0 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
18fe0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
18ff0 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
19000 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
19010 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
19020 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
19030 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
19040 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
19050 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
19060 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
19070 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
19080 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
19090 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
190a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
190b0 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
190c0 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
190d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
190e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
190f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19100 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
19110 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
19120 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19130 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
19140 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
19150 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20  Ref(pKeyInfo),. 
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
19180 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
19190 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
191a0 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
191b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
191c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
191d0 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
191e0 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
191f0 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53  end:.  pDest->iS
19200 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  dst = dest.iSdst
19210 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
19220 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20   = dest.nSdst;. 
19230 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
19240 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
19250 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19260 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19270 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
19280 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
19290 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
192a0 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20  for when two or 
192b0 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20  more terms of a 
192c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
192d0 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
192e0 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65  * size result se
192f0 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
19300 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75  te3SelectWrongNu
19310 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73  mTermsError(Pars
19320 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
19330 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
19340 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
19350 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  lues ){.    sqli
19360 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19370 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
19380 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
19390 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
193a0 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ms");.  }else{. 
193b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
193c0 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
193d0 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
193e0 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
193f0 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
19400 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
19410 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
19420 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
19430 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
19440 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19450 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
19460 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
19470 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
19480 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
19490 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
194a0 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
194b0 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
194c0 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
194d0 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65  Sdst.  There are
194e0 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63  .** pIn->nSdst c
194f0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74  olumns to be out
19500 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77  put.  pDest is w
19510 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20  here the output 
19520 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e  should.** be sen
19530 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75  t..**.** regRetu
19540 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  rn is the number
19550 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72   of the register
19560 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62   holding the sub
19570 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
19580 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  n address..**.**
19590 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
195a0 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72  en it is the fir
195b0 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61  st register in a
195c0 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20   vector that.** 
195d0 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76  records the prev
195e0 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65  ious output.  me
195f0 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20  m[regPrev] is a 
19600 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c  flag that is fal
19610 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68  se.** if there h
19620 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69  as been no previ
19630 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20  ous output.  If 
19640 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63  regPrev>0 then c
19650 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61  ode is.** genera
19660 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20  ted to suppress 
19670 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65  duplicates.  pKe
19680 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f  yInfo is used fo
19690 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b  r comparing.** k
196a0 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eys..**.** If th
196b0 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e  e LIMIT found in
196c0 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65   p->iLimit is re
196d0 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65  ached, jump imme
196e0 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42  diately to.** iB
196f0 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reak..*/.static 
19700 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70  int generateOutp
19710 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20  utSubroutine(.  
19720 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19730 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
19740 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19750 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
19760 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
19770 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19780 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
19790 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pIn,        /* 
197a0 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79  Coroutine supply
197b0 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65  ing data */.  Se
197c0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
197d0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
197e0 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20  o send the data 
197f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
19800 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rn,          /* 
19810 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  The return addre
19820 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ss register */. 
19830 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20   int regPrev,   
19840 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
19850 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69  ious result regi
19860 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65  ster.  No unique
19870 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b  ness if 0 */.  K
19880 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
19890 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  ,      /* For co
198a0 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65  mparing with pre
198b0 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20  vious entry */. 
198c0 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
198d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
198e0 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20   here if we hit 
198f0 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a  the LIMIT */.){.
19900 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
19910 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
19920 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e   iContinue;.  in
19930 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20  t addr;..  addr 
19940 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19950 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
19960 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
19970 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19980 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65  v);..  /* Suppre
19990 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f  ss duplicates fo
199a0 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  r UNION, EXCEPT,
199b0 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a   and INTERSECT .
199c0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
199d0 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  ev ){.    int ad
199e0 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
199f0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
19a00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19a10 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b  IfNot, regPrev);
19a20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19a30 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
19a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
19a50 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
19a60 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
19a70 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
19a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
19ab0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
19ac0 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  o), P4_KEYINFO);
19ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19ae0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
19af0 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e  p, addr2+2, iCon
19b00 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b  tinue, addr2+2);
19b10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19b20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19b30 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
19b40 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
19b50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19b60 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73  _Copy, pIn->iSds
19b70 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
19b80 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20  n->nSdst-1);.   
19b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19ba0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19bb0 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
19bc0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
19bd0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19be0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
19bf0 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
19c00 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
19c10 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
19c20 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
19c30 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
19c40 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
19c50 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
19c60 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
19c70 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ->eDest!=SRT_Exi
19c80 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sts );.  assert(
19c90 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
19ca0 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77  RT_Table );.  sw
19cb0 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
19cc0 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
19cd0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
19ce0 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
19cf0 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
19d00 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
19d10 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
19d20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
19d30 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19d40 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32  e);.      int r2
19d50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19d60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19d80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
19d90 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
19da0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
19db0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
19dc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19dd0 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65  OP_NewRowid, pDe
19de0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29  st->iSDParm, r2)
19df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19e00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19e10 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
19e20 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b  SDParm, r1, r2);
19e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19e40 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
19e50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
19e60 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
19e70 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19e80 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19e90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19ea0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
19eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19ec0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
19ed0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19ee0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
19ef0 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
19f00 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
19f10 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a   (SELECT ...)"..
19f20 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19f30 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
19f40 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74   int r1;.      t
19f50 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53  estcase( pIn->nS
19f60 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72  dst>1 );.      r
19f70 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
19f80 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
19f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19fa0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
19fb0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
19fc0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
19fd0 20 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20   .          r1, 
19fe0 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
19ff0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a010 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1a020 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
1a030 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a040 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a050 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1a060 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
1a070 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a080 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a0a0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
1a0b0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
1a0c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a0d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
1a0e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a0f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1a100 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
1a110 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
1a120 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
1a130 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
1a140 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
1a150 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
1a160 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
1a170 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
1a180 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1a190 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
1a1a0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
1a1b0 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
1a1c0 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
1a1d0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a1e0 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  >0 );  testcase(
1a1f0 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29   pIn->nSdst!=1 )
1a200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a210 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
1a220 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
1a230 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a240 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
1a250 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
1a260 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
1a270 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
1a280 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
1a290 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
1a2a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a2b0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1a2c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1a2d0 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a2e0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a2f0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1a300 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
1a310 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
1a320 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
1a330 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
1a340 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
1a350 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
1a360 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
1a370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
1a380 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
1a390 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1a3a0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
1a3b0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
1a3c0 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
1a3d0 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
1a3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a3f0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a400 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a410 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  est->iSdst, pIn-
1a420 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a440 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
1a450 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
1a460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a470 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
1a480 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
1a490 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1a4a0 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
1a4b0 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
1a4c0 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
1a4d0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
1a4e0 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
1a4f0 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
1a500 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
1a510 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
1a520 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
1a530 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
1a540 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
1a550 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
1a560 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a570 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a580 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
1a590 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
1a5a0 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
1a5b0 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
1a5c0 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
1a5d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
1a5e0 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
1a5f0 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
1a600 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1a610 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
1a620 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
1a630 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a640 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a650 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
1a660 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a670 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a680 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1a690 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1a6a0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
1a6b0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
1a6c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a6d0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
1a6e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1a6f0 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
1a700 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20  T is reached..  
1a710 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
1a720 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
1a730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a740 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
1a750 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
1a760 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
1a770 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  (v);.  }..  /* G
1a780 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
1a790 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
1a7a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a7b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a7c0 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
1a7d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1a7e0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
1a7f0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
1a800 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1a810 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
1a820 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
1a830 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
1a840 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
1a850 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
1a860 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
1a870 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
1a880 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
1a890 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
1a8a0 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
1a8b0 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
1a8c0 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
1a8d0 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
1a8e0 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
1a8f0 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
1a900 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
1a910 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
1a920 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
1a930 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
1a940 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
1a950 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
1a960 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a970 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
1a980 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
1a990 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
1a9a0 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
1a9b0 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
1a9c0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
1a9d0 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
1a9e0 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
1a9f0 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
1aa00 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
1aa10 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
1aa20 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
1aa30 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
1aa40 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
1aa50 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
1aa60 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
1aa70 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
1aa80 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1aa90 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
1aaa0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
1aab0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
1aac0 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
1aad0 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
1aae0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
1aaf0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
1ab00 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1ab10 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
1ab20 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
1ab30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ab40 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
1ab50 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
1ab60 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
1ab70 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
1ab80 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
1ab90 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
1aba0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
1abb0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
1abc0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
1abd0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
1abe0 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
1abf0 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
1ac00 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1ac10 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1ac20 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
1ac30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
1ac40 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1ac50 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
1ac60 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
1ac70 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
1ac80 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
1ac90 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
1aca0 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
1acb0 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
1acc0 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
1acd0 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
1ace0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
1acf0 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
1ad00 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1ad10 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
1ad20 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
1ad30 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
1ad40 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
1ad50 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
1ad70 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
1ad80 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
1ad90 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
1ada0 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
1adb0 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1adc0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
1add0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1ade0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1adf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
1ae00 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
1ae10 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
1ae20 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
1ae30 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
1ae40 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
1ae50 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
1ae60 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
1ae70 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
1ae80 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
1ae90 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
1aea0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
1aeb0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
1aec0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
1aed0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
1aee0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
1aef0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
1af00 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
1af10 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
1af20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
1af30 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
1af40 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
1af50 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1af60 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1af70 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
1af80 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
1af90 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
1afa0 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
1afb0 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
1afc0 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
1afd0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
1afe0 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
1aff0 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
1b000 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
1b010 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
1b020 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
1b030 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
1b040 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
1b050 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
1b060 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
1b070 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
1b080 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
1b090 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
1b0a0 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
1b0b0 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
1b0c0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
1b0d0 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
1b0e0 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
1b0f0 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
1b100 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
1b110 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
1b120 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
1b130 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
1b140 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
1b150 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
1b160 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
1b170 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
1b180 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
1b190 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
1b1a0 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
1b1b0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
1b1c0 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
1b1d0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1b1e0 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
1b1f0 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
1b200 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
1b210 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
1b220 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
1b230 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
1b240 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
1b250 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
1b260 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
1b270 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
1b280 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
1b290 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
1b2a0 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
1b2b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
1b2c0 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
1b2d0 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
1b2e0 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
1b2f0 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
1b300 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
1b310 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
1b320 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
1b330 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
1b340 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
1b350 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
1b360 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
1b370 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
1b380 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
1b390 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
1b3a0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
1b3b0 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
1b3c0 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
1b3d0 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
1b3e0 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
1b3f0 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
1b400 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
1b410 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
1b420 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
1b430 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
1b440 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
1b450 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
1b460 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
1b470 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
1b480 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
1b490 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
1b4a0 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
1b4b0 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
1b4c0 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
1b4d0 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
1b4e0 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
1b4f0 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
1b500 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
1b510 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
1b520 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
1b530 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
1b540 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
1b550 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
1b560 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
1b570 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
1b580 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
1b590 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
1b5a0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
1b5b0 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
1b5c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1b5d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1b5e0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1b5f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1b600 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
1b610 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
1b620 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
1b630 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
1b640 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
1b650 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
1b660 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
1b670 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
1b680 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1b690 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
1b6a0 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
1b6b0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
1b6c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
1b6d0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
1b6e0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1b6f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1b700 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
1b710 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
1b720 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
1b730 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
1b740 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
1b750 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1b760 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
1b770 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
1b780 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
1b790 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
1b7a0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
1b7b0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1b7c0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
1b7d0 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
1b7e0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b7f0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
1b800 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
1b810 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
1b820 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
1b830 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
1b840 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
1b850 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
1b860 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
1b870 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
1b880 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
1b890 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
1b8a0 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
1b8b0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
1b8c0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
1b8d0 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
1b8e0 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
1b8f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b900 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
1b910 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
1b920 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b930 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
1b940 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b950 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
1b960 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b970 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20  t addrOutB = 0; 
1b980 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b990 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
1b9a0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b9b0 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
1b9c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b9d0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
1b9e0 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
1b9f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba00 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20  drEofA_noB;     
1ba10 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64  /* Alternate add
1ba20 72 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e  rEofA if B is un
1ba30 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
1ba40 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20   int addrEofB;  
1ba50 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1ba60 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1ba70 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  B-exhausted subr
1ba80 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1ba90 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20  addrAltB;       
1baa0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1bab0 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69  the A<B subrouti
1bac0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1bad0 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AeqB;         /*
1bae0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1baf0 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  A==B subroutine 
1bb00 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74  */.  int addrAgt
1bb10 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
1bb20 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42  dress of the A>B
1bb30 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1bb40 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20   int regLimitA; 
1bb50 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
1bb60 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1bb70 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
1bb80 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20  egLimitB;       
1bb90 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
1bba0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1bbb0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
1bbc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
1bbd0 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
1bbe0 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69  rs to hold previ
1bbf0 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ous output */.  
1bc00 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20  int savedLimit; 
1bc10 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
1bc20 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69  alue of p->iLimi
1bc30 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
1bc40 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
1bc50 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
1bc60 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ->iOffset */.  i
1bc70 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20  nt labelCmpr;   
1bc80 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
1bc90 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
1bca0 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74  he merge algorit
1bcb0 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  hm */.  int labe
1bcc0 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  lEnd;         /*
1bcd0 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65   Label for the e
1bce0 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c  nd of the overal
1bcf0 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f  l SELECT stmt */
1bd00 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
1bd10 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1bd20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
1bd30 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74  at get retargett
1bd40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ed */.  int op; 
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd60 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20   One of TK_ALL, 
1bd70 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
1bd80 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43  EPT, TK_INTERSEC
1bd90 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  T */.  KeyInfo *
1bda0 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20  pKeyDup = 0; /* 
1bdb0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
1bdc0 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  mation for dupli
1bdd0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a  cate removal */.
1bde0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d    KeyInfo *pKeyM
1bdf0 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61  erge;   /* Compa
1be00 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
1be10 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f  n for merging ro
1be20 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ws */.  sqlite3 
1be30 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
1be40 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1be50 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
1be60 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
1be70 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1be80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1be90 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1bea0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1beb0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
1bec0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1bed0 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20   int *aPermute; 
1bee0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
1bef0 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20  g from ORDER BY 
1bf00 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20  terms to result 
1bf10 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  set columns */..
1bf20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
1bf30 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
1bf40 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
1bf50 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
1bf60 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
1bf70 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
1bf80 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
1bf90 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
1bfa0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
1bfb0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
1bfc0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
1bfd0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
1bfe0 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
1bff0 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
1c000 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
1c010 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1c020 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
1c030 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1c040 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
1c050 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
1c060 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
1c070 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
1c080 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
1c090 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
1c0a0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
1c0b0 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
1c0c0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1c0d0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1c0e0 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
1c0f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
1c100 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
1c110 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
1c120 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
1c130 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
1c140 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
1c150 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
1c160 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
1c170 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
1c180 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
1c190 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
1c1a0 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
1c1b0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
1c1c0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
1c1d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
1c1e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
1c1f0 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
1c200 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1c210 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1c220 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c230 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
1c240 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
1c250 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
1c260 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
1c270 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c280 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1c290 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
1c2a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1c2b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1c2c0 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
1c2d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
1c2e0 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
1c2f0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
1c300 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1c310 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
1c320 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c330 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
1c340 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1c350 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1c360 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
1c370 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
1c380 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
1c390 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72  ;.        p->pOr
1c3a0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1c3b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1c3c0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1c3d0 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
1c3e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
1c3f0 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
1c400 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
1c410 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1c420 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
1c430 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1c440 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
1c450 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
1c460 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
1c470 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
1c480 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
1c490 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
1c4a0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
1c4b0 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
1c4c0 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
1c4d0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
1c4e0 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
1c4f0 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
1c500 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
1c510 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c520 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
1c530 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
1c540 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
1c550 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
1c560 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
1c570 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
1c580 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
1c590 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
1c5a0 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
1c5b0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
1c5c0 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
1c5d0 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b  (nOrderBy + 1));
1c5e0 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
1c5f0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
1c600 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c610 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65  em;.    aPermute
1c620 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  [0] = nOrderBy;.
1c630 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74      for(i=1, pIt
1c640 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
1c650 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  i<=nOrderBy; i++
1c660 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c670 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1c680 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1c690 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
1c6a0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c6b0 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70  OrderByCol<=p->p
1c6c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1c6d0 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
1c6e0 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  ] = pItem->u.x.i
1c6f0 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
1c700 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
1c710 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  rge = multiSelec
1c720 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
1c730 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
1c740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
1c750 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
1c760 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
1c770 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c780 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
1c790 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
1c7a0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1c7b0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1c7c0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1c7d0 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
1c7e0 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
1c7f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1c800 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
1c810 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
1c820 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
1c830 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
1c840 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
1c850 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
1c860 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
1c870 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
1c880 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
1c890 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
1c8a0 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
1c8b0 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
1c8c0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1c8d0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
1c8e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1c8f0 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
1c900 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1c910 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
1c920 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
1c930 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1c940 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
1c950 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1c960 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1c970 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
1c980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c990 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1c9a0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
1c9b0 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
1c9c0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
1c9d0 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
1c9e0 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
1c9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1ca00 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
1ca10 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
1ca20 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1ca30 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
1ca40 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
1ca50 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
1ca60 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
1ca70 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
1ca80 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1ca90 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1caa0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1cab0 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
1cac0 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
1cad0 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
1cae0 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
1caf0 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
1cb00 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69  rior = 0;.  pPri
1cb10 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  or->pNext = 0;. 
1cb20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
1cb30 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
1cb40 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
1cb50 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1cb60 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
1cb70 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
1cb80 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1cb90 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1cba0 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
1cbb0 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1cbc0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
1cbd0 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
1cbe0 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
1cbf0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
1cc00 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
1cc10 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
1cc20 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
1cc30 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1cc40 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
1cc50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1cc60 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
1cc70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1cc80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cc90 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
1cca0 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
1ccb0 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
1ccc0 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
1ccf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cd00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1cd10 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
1cd20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
1cd30 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
1cd40 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
1cd50 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1cd60 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1cd70 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
1cd80 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  >pLimit = 0;..  
1cd90 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
1cda0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1cdb0 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
1cdc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
1cdd0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cde0 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
1cdf0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1ce00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1ce10 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
1ce20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
1ce30 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1ce40 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1ce50 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
1ce60 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ce70 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75  B);..  ExplainQu
1ce80 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
1ce90 20 31 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22   1, "MERGE (%s)"
1cea0 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
1ceb0 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47  ->op)));..  /* G
1cec0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
1ced0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
1cee0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1cef0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
1cf00 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
1cf10 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
1cf20 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
1cf30 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
1cf40 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctA = sqlite3Vdb
1cf50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
1cf60 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  + 1;.  addr1 = s
1cf70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cf80 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
1cf90 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20  tine, regAddrA, 
1cfa0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  0, addrSelectA);
1cfb0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1cfc0 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22  v, "left SELECT"
1cfd0 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
1cfe0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
1cff0 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
1d000 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
1d010 20 22 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c   "LEFT"));.  sql
1d020 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1d030 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
1d040 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1d050 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
1d060 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1d070 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1d080 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
1d090 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
1d0a0 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
1d0b0 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
1d0c0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
1d0d0 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
1d0e0 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
1d0f0 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
1d100 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1d110 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1d120 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1d130 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1d140 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1d150 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61  , regAddrB, 0, a
1d160 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56  ddrSelectB);.  V
1d170 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d180 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
1d190 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
1d1a0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
1d1b0 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
1d1c0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
1d1d0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
1d1e0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
1d1f0 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  ;  .  ExplainQue
1d200 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1d210 31 2c 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20  1, "RIGHT"));.  
1d220 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1d230 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
1d240 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1d250 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
1d260 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
1d270 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
1d280 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1d290 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  e(v, regAddrB);.
1d2a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d2b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1d2c0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1d2d0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1d2e0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
1d2f0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1d300 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1d310 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1d320 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1d330 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1d340 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
1d350 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
1d360 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1d370 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
1d3a0 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1d3c0 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1d3d0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
1d3e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d3f0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1d400 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1d410 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
1d420 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1d430 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1d440 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1d450 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1d460 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1d470 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1d480 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1d490 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1d4a0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
1d4b0 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
1d4c0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1d4d0 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1d4e0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1d4f0 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
1d500 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1d530 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1d540 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
1d550 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
1d560 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d570 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1d580 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1d590 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1d5a0 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
1d5b0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1d5c0 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
1d5d0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1d5e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
1d5f0 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
1d600 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1d610 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
1d620 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
1d630 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1d640 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d650 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
1d660 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1d670 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
1d680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d690 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1d6a0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
1d6b0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1d6c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d6d0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d6e0 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
1d6f0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1d720 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1d730 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1d740 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
1d750 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1d760 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1d770 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
1d780 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d790 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ow);.  }..  /* G
1d7a0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1d7b0 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1d7c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1d7d0 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
1d7e0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1d7f0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1d800 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
1d810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1d820 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1d830 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
1d840 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
1d850 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
1d860 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1d870 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
1d880 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
1d890 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
1d8a0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1d8b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1d8c0 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
1d8d0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
1d8e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d8f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d900 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1d910 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1d920 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d930 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1d940 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62  , labelEnd); Vdb
1d950 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d960 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1d970 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  o(v, addrEofB);.
1d980 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1d990 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1d9a0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1d9b0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1d9c0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1d9d0 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1d9e0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1d9f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1da00 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1da10 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1da20 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1da30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1da40 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1da50 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1da60 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1da70 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1da80 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1da90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1daa0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1dab0 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1dac0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1dad0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1dae0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1daf0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1db00 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1db10 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1db20 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1db30 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1db40 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1db50 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1db60 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1db70 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1db80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1db90 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dba0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1dbb0 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1dbc0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1dbd0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1dbe0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1dbf0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1dc00 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1dc10 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1dc20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1dc30 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1dc40 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1dc50 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1dc60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1dc70 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1dc80 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1dc90 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1dca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dcb0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1dcc0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1dcd0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1dce0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dcf0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1dd00 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1dd10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1dd20 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1dd30 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1dd40 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
1dd50 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
1dd60 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
1dd70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1dd80 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1dd90 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
1dda0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ddb0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1ddc0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1ddd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1dde0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1ddf0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1de00 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1de10 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1de20 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1de30 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1de40 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1de50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1de60 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1de70 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1de80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1de90 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1dea0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1deb0 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1dec0 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1ded0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1dee0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1def0 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1df00 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1df30 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1df40 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1df50 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1df60 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1df70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1df80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1df90 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1dfa0 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1dfb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1dfc0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1dfd0 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1dfe0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1dff0 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1e000 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1e010 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1e020 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1e030 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1e040 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1e050 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1e060 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1e070 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1e080 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1e090 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1e0a0 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1e0b0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1e0c0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1e0d0 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1e0e0 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1e0f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1e100 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1e110 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1e120 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1e130 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1e140 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1e150 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70  ries ****/.  Exp
1e160 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
1e170 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
1e180 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1e190 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1e1a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1e1b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1e1c0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1e1d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a  ITE_OMIT_VIEW)..
1e1e0 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
1e1f0 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65  f the SubstConte
1e200 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  xt object descri
1e210 62 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74  bes an substitut
1e220 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62  ion edit.** to b
1e230 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61  e performed on a
1e240 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a   parse tree..**.
1e250 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65  ** All reference
1e260 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
1e270 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65  table iTable are
1e280 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1e290 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  by corresponding
1e2a0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1e2b0 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79  in pEList..*/.ty
1e2c0 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62  pedef struct Sub
1e2d0 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61  stContext {.  Pa
1e2e0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1e2f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1e300 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1e310 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20  /.  int iTable; 
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e330 20 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e   Replace referen
1e340 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ces to this tabl
1e350 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54  e */.  int iNewT
1e360 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1e370 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75   /* New table nu
1e380 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mber */.  int is
1e390 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20  LeftJoin;       
1e3a0 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46      /* Add TK_IF
1e3b0 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65  _NULL_ROW opcode
1e3c0 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63  s on each replac
1e3d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ement */.  ExprL
1e3e0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1e3f0 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d       /* Replacem
1e400 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ent expressions 
1e410 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78  */.} SubstContex
1e420 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  t;../* Forward D
1e430 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
1e440 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1e450 45 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f  ExprList(SubstCo
1e460 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74  ntext*, ExprList
1e470 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
1e480 73 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73  substSelect(Subs
1e490 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63  tContext*, Selec
1e4a0 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  t*, int);../*.**
1e4b0 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
1e4c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1e4d0 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
1e4e0 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
1e4f0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1e500 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
1e510 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
1e520 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
1e530 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
1e540 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
1e550 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1e560 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
1e570 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
1e580 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e590 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
1e5a0 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
1e5b0 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
1e5c0 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
1e5d0 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
1e5e0 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
1e5f0 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
1e600 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
1e610 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1e620 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
1e630 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
1e640 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
1e650 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
1e660 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
1e670 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
1e680 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
1e690 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
1e6a0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
1e6b0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
1e6c0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
1e6d0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
1e6e0 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
1e6f0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1e700 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
1e710 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
1e720 45 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e  Expr(.  SubstCon
1e730 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f  text *pSubst,  /
1e740 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1e750 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f   the substitutio
1e760 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1e770 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
1e780 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1e790 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1e7a0 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rs */.){.  if( p
1e7b0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
1e7c0 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
1e7d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e7e0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
1e7f0 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68   && pExpr->iRigh
1e800 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62  tJoinTable==pSub
1e810 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a  st->iTable.  ){.
1e820 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68      pExpr->iRigh
1e830 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75  tJoinTable = pSu
1e840 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1e850 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
1e860 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
1e870 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
1e880 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20  =pSubst->iTable 
1e890 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
1e8a0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
1e8b0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1e8c0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
1e8d0 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1e8e0 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
1e8f0 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73  r *pCopy = pSubs
1e900 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
1e910 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1e920 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69  pr;.      Expr i
1e930 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20  fNullRow;.      
1e940 61 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e  assert( pSubst->
1e950 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1e960 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62  pr->iColumn<pSub
1e970 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st->pEList->nExp
1e980 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
1e990 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
1e9a0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
1e9b0 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
1e9c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1e9d0 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29  sVector(pCopy) )
1e9e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e9f0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
1ea00 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20  pSubst->pParse, 
1ea10 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65  pCopy);.      }e
1ea20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1ea30 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73  ite3 *db = pSubs
1ea40 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  t->pParse->db;. 
1ea50 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73         if( pSubs
1ea60 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26  t->isLeftJoin &&
1ea70 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43   pCopy->op!=TK_C
1ea80 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1ea90 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c     memset(&ifNul
1eaa0 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lRow, 0, sizeof(
1eab0 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20  ifNullRow));.   
1eac0 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1ead0 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c  .op = TK_IF_NULL
1eae0 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20  _ROW;.          
1eaf0 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20  ifNullRow.pLeft 
1eb00 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
1eb10 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61     ifNullRow.iTa
1eb20 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1eb30 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ewTable;.       
1eb40 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75     pCopy = &ifNu
1eb50 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  llRow;.        }
1eb60 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1eb70 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1eb80 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20  b, pCopy, 0);.  
1eb90 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1eba0 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  & pSubst->isLeft
1ebb0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Join ){.        
1ebc0 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1ebd0 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65  y(pNew, EP_CanBe
1ebe0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
1ebf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1ec00 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  w && ExprHasProp
1ec10 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72  erty(pExpr,EP_Fr
1ec20 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1ec30 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68       pNew->iRigh
1ec40 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78  tJoinTable = pEx
1ec50 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1ec60 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45  ble;.          E
1ec70 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1ec80 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  New, EP_FromJoin
1ec90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1eca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ecb0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1ecc0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1ecd0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1ece0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1ecf0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1ed00 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
1ed10 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  W && pExpr->iTab
1ed20 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1ed30 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  le ){.      pExp
1ed40 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  r->iTable = pSub
1ed50 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1ed60 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
1ed70 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1ed80 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1ed90 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
1eda0 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1edb0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1edc0 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1edd0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ede0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1edf0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1ee00 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1ee10 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ee20 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  x.pSelect, 1);. 
1ee30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee40 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1ee50 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1ee60 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1ee70 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1ee80 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1ee90 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1eea0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1eeb0 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1eec0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1eed0 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1eee0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
1eef0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1ef00 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1ef10 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1ef20 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  utes */.){.  int
1ef30 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1ef40 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1ef50 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ef60 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1ef70 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1ef80 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1ef90 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61  pSubst, pList->a
1efa0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
1efb0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1efc0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62  bstSelect(.  Sub
1efd0 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1efe0 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1eff0 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1f000 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ution */.  Selec
1f010 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1f020 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1f030 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1f040 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1f050 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ons */.  int doP
1f060 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rior           /
1f070 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1f080 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1f090 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1f0a0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1f0b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f0c0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1f0d0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1f0e0 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1f0f0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f100 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  t, p->pEList);. 
1f110 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1f120 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f  (pSubst, p->pGro
1f130 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74  upBy);.    subst
1f140 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f150 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
1f160 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1f170 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1f180 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  , p->pHaving);. 
1f190 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1f1a0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f1b0 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
1f1c0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1f1d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
1f1e0 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c!=0 );.    for(
1f1f0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1f200 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1f210 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1f220 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1f230 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  ct(pSubst, pItem
1f240 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
1f250 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f260 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1f270 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1f280 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49  rList(pSubst, pI
1f290 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1f2a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f2b0 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1f2c0 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1f2d0 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1f2e0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1f2f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f300 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f310 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f320 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1f330 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f340 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1f350 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f360 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1f370 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f380 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1f390 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1f3a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1f3b0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1f3c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f3d0 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1f3e0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1f3f0 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1f400 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1f410 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1f420 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1f430 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1f440 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1f450 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1f460 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1f470 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1f480 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f490 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1f4a0 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1f4b0 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1f4c0 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1f4d0 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1f4e0 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1f4f0 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1f500 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1f510 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1f520 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1f530 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1f540 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1f550 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1f560 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1f570 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1f580 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1f590 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1f5a0 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1f5b0 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1f5c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f5d0 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1f5e0 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1f5f0 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1f600 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1f610 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1f620 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1f630 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1f640 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1f650 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1f660 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1f670 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f680 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f690 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1f6a0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1f6b0 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1f6c0 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1f6d0 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1f6e0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1f6f0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1f700 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1f710 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1f720 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1f730 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1f740 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1f750 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1f760 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1f770 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1f780 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74   is subject to t
1f790 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1f7a0 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  straints:.**.** 
1f7b0 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f7c0 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f7d0 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f7e0 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f7f0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1f800 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1f810 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1f820 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72  not both be aggr
1f830 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1f840 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f850 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f860 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f870 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f880 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66  **        (2) If
1f890 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1f8a0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
1f8b0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61  en.**        (2a
1f8c0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1f8d0 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  y must not be a 
1f8e0 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1f8f0 20 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65     (2b) the oute
1f900 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1f910 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a   use subqueries.
1f920 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1f930 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1f940 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  e FROM-clause su
1f950 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1f960 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20   candidate.**   
1f970 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c            for fl
1f980 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73  attening.  (This
1f990 20 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65   is due to ticke
1f9a0 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1f9b0 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20  bf80].**        
1f9c0 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30       from 2015-0
1f9d0 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1f9e0 33 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3)  If the subqu
1f9f0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1fa00 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1fa10 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20  FT JOIN then.** 
1fa20 20 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20         (3a) the 
1fa30 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1fa40 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1fa50 2a 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68  *        (3b) th
1fa60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1fa70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1fa80 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  y not contain a 
1fa90 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20  virtual.**      
1faa0 20 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64         table and
1fab0 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20  .**        (3c) 
1fac0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fad0 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
1fae0 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20  gregate..**.**  
1faf0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1fb00 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49  ry can not be DI
1fb10 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1fb20 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1fb30 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1fb40 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1fb50 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1fb60 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1fb70 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1fb80 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1fb90 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1fba0 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1fbb0 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1fbc0 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1fbd0 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1fbe0 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1fbf0 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1fc00 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1fc10 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1fc20 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1fc30 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1fc40 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
1fc50 20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65     If the subque
1fc60 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1fc70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fc80 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
1fc90 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1fca0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1fcb0 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1fcc0 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1fcd0 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1fce0 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1fcf0 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1fd00 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1fd10 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1fd20 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1fd30 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1fd40 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1fd50 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1fd60 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1fd70 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1fd80 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1fd90 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68  .**   (8)  If th
1fda0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fdb0 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fdc0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fdd0 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  ot be a join..**
1fde0 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68  .**   (9)  If th
1fdf0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fe00 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fe10 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fe20 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e  ot be aggregate.
1fe30 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1fe40 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1fe50 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1fe60 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1fe70 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1fe80 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1fe90 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1fea0 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1feb0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1fec0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1fed0 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a       constraint:
1fee0 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72   "If the subquer
1fef0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74  y is aggregate t
1ff00 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
1ff10 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d  ery .**        m
1ff20 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1ff30 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1ff40 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1ff50 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ff60 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61   may not both ha
1ff70 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1ff80 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1ff90 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1ffa0 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1ffb0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1ffc0 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1ffd0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1ffe0 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1fff0 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
20000 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
20010 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
20020 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
20030 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
20040 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
20050 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
20060 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
20070 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
20080 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74  *.**  (15)  If t
20090 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
200a0 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
200b0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
200c0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
200d0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
200e0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20   use LIMIT..**  
200f0 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
20100 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
20110 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
20120 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49  ..**.**  (16)  I
20130 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
20140 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
20150 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
20160 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
20170 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59      use ORDER BY
20180 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
20190 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
201a0 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
201b0 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
201c0 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
201d0 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
201e0 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
201f0 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71  17)  If the subq
20200 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
20210 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a  nd select, then.
20220 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20  **        (17a) 
20230 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  all compound ope
20240 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61  rators must be a
20250 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a   UNION ALL, and.
20260 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20  **        (17b) 
20270 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20  no terms within 
20280 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
20290 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67  pound may be agg
202a0 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  regate.**       
202b0 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e         or DISTIN
202c0 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  CT, and.**      
202d0 20 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65    (17c) every te
202e0 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  rm within the su
202f0 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
20300 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
20310 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
20320 20 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65    (17d) the oute
20330 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20340 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
20350 20 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67     (17d1) aggreg
20360 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  ate, or.**      
20370 20 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44          (17d2) D
20380 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20  ISTINCT, or.**  
20390 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
203a0 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  3) a join..**.**
203b0 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
203c0 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
203d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
203e0 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
203f0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
20400 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
20410 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
20420 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
20430 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
20440 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
20450 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
20460 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
20470 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
20480 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
20490 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
204a0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
204b0 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
204c0 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
204d0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
204e0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
204f0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
20500 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
20510 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
20520 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
20530 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
20540 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
20550 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20560 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
20570 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
20580 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
20590 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
205a0 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
205b0 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
205c0 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
205d0 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
205e0 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
205f0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
20600 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
20610 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
20620 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
20630 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
20640 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
20650 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
20660 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
20670 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
20680 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
20690 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
206a0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
206b0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
206c0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
206d0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
206e0 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
206f0 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  BY clause of the
20700 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
20710 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
20720 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
20730 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
20740 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
20750 20 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75   (19)  If the su
20760 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49  bquery uses LIMI
20770 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  T then the outer
20780 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a   query may not.*
20790 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
207a0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
207b0 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
207c0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
207d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
207e0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
207f0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
20800 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
20810 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
20820 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
20830 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
20840 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
20850 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
20860 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
20870 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
20880 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
20890 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
208a0 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
208b0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
208c0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
208d0 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
208e0 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
208f0 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
20900 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
20910 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
20920 28 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62  (21)  If the sub
20930 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
20940 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20950 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20960 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
20970 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
20980 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
20990 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
209a0 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
209b0 6f 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76  ot be a recursiv
209c0 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  e CTE..**.**  (*
209d0 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  *)  Subsumed int
209e0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  o restriction (1
209f0 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74  7d3).  Was: If t
20a00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
20a10 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65  s.**        a re
20a20 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65  cursive CTE, the
20a30 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
20a40 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
20a50 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20  pound query..** 
20a60 20 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74         This rest
20a70 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
20a80 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
20a90 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
20aa0 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
20ab0 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
20ac0 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
20ad0 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
20ae0 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
20af0 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
20b00 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ct()..**.**  (**
20b10 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
20b20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
20b30 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
20b40 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
20b50 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62  *        The sub
20b60 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20b70 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
20b80 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c  at uses the buil
20b90 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a  t-in min() or .*
20ba0 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28  *        or max(
20bb0 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57  ) functions.  (W
20bc0 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74  ithout this rest
20bd0 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79  riction, a query
20be0 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20   like:.**       
20bf0 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
20c00 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20  (SELECT max(y), 
20c10 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c  x FROM t1)" woul
20c20 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  d not necessaril
20c30 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75  y.**        retu
20c40 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66  rn the value X f
20c50 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d  or which Y was m
20c60 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a  aximal.).**.**.*
20c70 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
20c80 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
20c90 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
20ca0 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
20cb0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
20cc0 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
20cd0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
20ce0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
20cf0 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
20d00 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
20d10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
20d20 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
20d30 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
20d40 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
20d50 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
20d60 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20d70 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
20d80 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20d90 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
20da0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
20db0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
20dc0 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
20dd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
20de0 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
20df0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
20e00 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
20e10 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
20e20 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
20e30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20e40 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
20e50 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
20e60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
20e70 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
20e80 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
20e90 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
20ea0 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
20eb0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
20ec0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
20ed0 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
20ee0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20  /.  int isAgg   
20ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20f00 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
20f10 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
20f20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
20f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
20f40 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
20f50 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
20f60 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
20f70 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
20f80 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
20f90 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
20fa0 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
20fb0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
20fc0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
20fd0 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
20fe0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
20ff0 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
21000 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
21010 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
21020 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
21030 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
21040 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
21050 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
21060 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
21070 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
21080 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
21090 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
210a0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
210b0 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
210c0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
210d0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
210e0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
210f0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
21100 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20  nt iNewParent = 
21110 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e  -1;/* Replacemen
21120 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72  t table for iPar
21130 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ent */.  int isL
21140 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20  eftJoin = 0; /* 
21150 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20  True if pSub is 
21160 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
21170 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
21180 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20      .  int i;   
21190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
211a0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
211b0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
211e0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
211f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21200 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
21210 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
21220 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21230 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
21240 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
21250 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
21260 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
21270 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
21280 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
21290 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
212a0 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Prior==0 );.  if
212b0 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
212c0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
212d0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
212e0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
212f0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
21300 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
21310 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
21320 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
21330 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
21340 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
21350 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
21360 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
21370 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
21380 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
21390 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
213a0 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29  .  if( p->pWin )
213b0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70 53   return 0;..  pS
213c0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
213d0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
213e0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
213f0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
21400 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
21410 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
21420 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
21430 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
21440 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
21450 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
21460 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
21470 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
21480 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
21490 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
214a0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
214b0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
214c0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
214d0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
214e0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
214f0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
21500 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
21510 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
21520 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
21530 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
21540 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
21550 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
21560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21570 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
21580 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
21590 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70  Limit && pSub->p
215a0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 29 20  Limit->pRight ) 
215b0 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 52  return 0;   /* R
215c0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
215d0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
215e0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
215f0 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
21600 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
21610 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21650 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
21660 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
21670 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
21680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21690 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
216a0 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
216b0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
216c0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
216d0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
216e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
216f0 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f 0a 20  iction (4)  */. 
21700 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21710 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
21720 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
21730 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
21740 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21750 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
21760 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
21770 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e  rderBy && pSub->
21780 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21790 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
217d0 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
217e0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
217f0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
21800 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21820 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
21830 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
21840 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20  it && p->pWhere 
21850 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
21860 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21870 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a  riction (19) */.
21880 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
21890 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  it && (p->selFla
218a0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
218b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )!=0 ){.     ret
218c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
218d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
218e0 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
218f0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
21900 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29 20   (SF_Recursive) 
21910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
21920 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
21930 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20   (22) */.  }..  
21940 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  /*.  ** If the s
21950 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
21960 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
21970 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
21980 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  n the.  ** subqu
21990 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
219a0 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20 28 33 61   join itself (3a
219b0 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66 20 77 68  ). Example of wh
219c0 79 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20  y this is not.  
219d0 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ** allowed:.  **
219e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
219f0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
21a00 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
21a10 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
21a20 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
21a30 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
21a40 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
21a50 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
21a60 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
21a70 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
21a80 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
21a90 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
21aa0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
21ab0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
21ac0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
21ad0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
21ae0 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a  n the outer.  **
21af0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
21b00 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 28   an aggregate. (
21b10 33 63 29 20 20 54 68 69 73 20 69 73 20 61 6e 20  3c)  This is an 
21b20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68 65 20  artifact of the 
21b30 77 61 79 0a 20 20 2a 2a 20 61 67 67 72 65 67 61  way.  ** aggrega
21b40 74 65 73 20 61 72 65 20 70 72 6f 63 65 73 73 65  tes are processe
21b50 64 20 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20  d - there is no 
21b60 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 64 65 74  mechanism to det
21b70 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a 2a 20 74  ermine if.  ** t
21b80 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61 62  he LEFT JOIN tab
21b90 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c  le should be all
21ba0 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  -NULL..  **.  **
21bb0 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74   See also ticket
21bc0 73 20 23 33 30 36 2c 20 23 33 35 30 2c 20 61 6e  s #306, #350, an
21bd0 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20  d #3300..  */.  
21be0 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66  if( (pSubitem->f
21bf0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
21c00 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
21c10 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b   isLeftJoin = 1;
21c20 0a 20 20 20 20 69 66 28 20 70 53 75 62 53 72 63  .    if( pSubSrc
21c30 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
21c40 67 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  g || IsVirtual(p
21c50 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  SubSrc->a[0].pTa
21c60 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 20  b) ){.      /*  
21c70 28 33 61 29 20 20 20 20 20 20 20 20 20 20 20 20  (3a)            
21c80 20 28 33 63 29 20 20 20 20 20 28 33 62 29 20 2a   (3c)     (3b) *
21c90 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
21ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  ;.    }.  }.#ifd
21cb0 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
21cc0 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65  IFNULLROW.  else
21cd0 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20   if( iFrom>0 && 
21ce0 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a  !isAgg ){.    /*
21cf0 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66 74 4a   Setting isLeftJ
21d00 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73 65 73  oin to -1 causes
21d10 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70   OP_IfNullRow op
21d20 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65 6e 65  codes to be gene
21d30 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a  rated for.    **
21d40 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
21d50 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74 20 63   to any result c
21d60 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75  olumn from subqu
21d70 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65  ery in a join, e
21d80 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67  ven.    ** thoug
21d90 68 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6e  h they are not n
21da0 65 63 65 73 73 61 72 79 2e 20 20 54 68 69 73 20  ecessary.  This 
21db0 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65 73 74  will stress-test
21dc0 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f   the OP_IfNullRo
21dd0 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65  w .    ** opcode
21de0 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a  . */.    isLeftJ
21df0 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65  oin = -1;.  }.#e
21e00 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72  ndif..  /* Restr
21e10 69 63 74 69 6f 6e 20 28 31 37 29 3a 20 49 66 20  iction (17): If 
21e20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
21e30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
21e40 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
21e50 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
21e60 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
21e70 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
21e80 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
21e90 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
21ea0 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
21eb0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
21ec0 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
21ed0 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
21ee0 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
21ef0 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
21f00 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
21f10 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
21f20 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
21f30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
21f40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
21f50 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  0) */.    }.    
21f60 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
21f70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
21f80 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
21f90 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
21fa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
21fb0 2f 2a 20 28 31 37 64 31 29 2c 20 28 31 37 64 32  /* (17d1), (17d2
21fc0 29 2c 20 6f 72 20 28 31 37 64 33 29 20 2a 2f 0a  ), or (17d3) */.
21fd0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
21fe0 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
21ff0 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
22000 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
22010 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
22020 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
22030 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
22040 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
22050 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
22060 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
22070 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
22080 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
22090 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
220a0 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  te );.      asse
220b0 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d  rt( pSub->pSrc!=
220c0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
220d0 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  t( pSub->pEList-
220e0 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70  >nExpr==pSub1->p
220f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
22100 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31        if( (pSub1
22110 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
22120 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
22130 72 65 67 61 74 65 29 29 21 3d 30 20 20 20 20 2f  regate))!=0    /
22140 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20 20 20 20  * (17b) */.     
22150 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
22160 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
22170 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20 20 20 20  !=TK_ALL)       
22180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
22190 61 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20  a) */.       || 
221a0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
221b0 63 3c 31 20 20 20 20 20 20 20 20 20 20 20 20 20  c<1             
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 20 20 20 20 2f 2a 20 28 31 37 63 29 20 2a 2f       /* (17c) */
221e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
221f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
22200 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
22210 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d  se( pSub1->pSrc-
22220 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d  >nSrc>1 );.    }
22230 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
22240 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a 20 20  tion (18). */.  
22250 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
22260 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
22270 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
22280 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
22290 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
222a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
222b0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
222c0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
222d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
222e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
222f0 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73 74 72 69  ..  /* Ex-restri
22300 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20 20 2a 2a  ction (23):.  **
22310 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68   The only way th
22320 61 74 20 74 68 65 20 72 65 63 75 72 73 69 76 65  at the recursive
22330 20 70 61 72 74 20 6f 66 20 61 20 43 54 45 20 63   part of a CTE c
22340 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d  an contain a com
22350 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75 62 71 75  pound.  ** subqu
22360 65 72 79 20 69 73 20 66 6f 72 20 74 68 65 20 73  ery is for the s
22370 75 62 71 75 65 72 79 20 74 6f 20 62 65 20 6f 6e  ubquery to be on
22380 65 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e  e term of a join
22390 2e 20 20 42 75 74 20 69 66 20 74 68 65 0a 20 20  .  But if the.  
223a0 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 61  ** subquery is a
223b0 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
223c0 66 6c 61 74 74 65 6e 69 6e 67 20 68 61 73 20 61  flattening has a
223d0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 6f 70  lready been stop
223e0 70 65 64 20 62 79 0a 20 20 2a 2a 20 72 65 73 74  ped by.  ** rest
223f0 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 0a 20  riction (17d3). 
22400 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
22410 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22420 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c  Recursive)==0 ||
22430 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30   pSub->pPrior==0
22440 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66   );..  /***** If
22450 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
22460 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
22470 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
22480 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52  ****/.  SELECTTR
22490 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
224a0 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66  "flatten %s.%p f
224b0 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a  rom term %d\n",.
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d     pSub->zSelNam
224e0 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29  e, pSub, iFrom))
224f0 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  ;..  /* Authoriz
22500 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
22510 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
22520 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
22530 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
22540 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
22550 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
22560 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
22570 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
22580 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
22590 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
225a0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
225b0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
225c0 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
225d0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
225e0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
225f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
22600 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
22610 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
22620 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
22630 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
22640 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
22650 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
22660 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
22670 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
22680 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
22690 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
226a0 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
226b0 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
226c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
226d0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
226e0 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
226f0 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
22700 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
22710 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
22720 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
22730 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
22740 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
22750 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
22760 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
22770 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
22780 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
22790 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
227a0 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
227b0 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
227c0 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
227d0 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
227e0 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
227f0 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
22800 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
22810 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
22820 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
22830 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
22840 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
22850 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
22860 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
22870 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
22880 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
22890 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
228a0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
228b0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
228c0 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
228d0 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
228e0 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
228f0 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
22900 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
22910 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
22920 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
22930 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
22940 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
22950 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
22960 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
22970 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
22980 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
22990 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
229a0 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
229b0 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
229c0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
229d0 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
229e0 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
229f0 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
22a00 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
22a10 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
22a20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
22a30 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
22a40 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
22a50 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
22a60 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
22a70 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
22a80 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
22a90 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
22aa0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
22ab0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
22ac0 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
22ad0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
22ae0 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
22af0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
22b00 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
22b10 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
22b20 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
22b30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
22b40 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
22b50 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e  New, pSub->zSelN
22b60 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  ame);.    p->pLi
22b70 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
22b80 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
22b90 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
22ba0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
22bb0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
22bc0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
22bd0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
22be0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
22bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c00 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
22c10 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
22c20 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
22c30 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
22c40 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
22c50 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
22c60 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
22c70 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
22c80 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22 63 6f  (2,pParse,p,("co
22c90 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
22ca0 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20 20 20  flattener".     
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 20 20 20 20 20 20 22 20 63 72 65 61 74           " creat
22cd0 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
22ce0 5c 6e 22 2c 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61  \n",pNew->zSelNa
22cf0 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20  me, pNew));.    
22d00 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
22d10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
22d20 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
22d30 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
22d40 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
22d50 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
22d60 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
22d70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22d80 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
22d90 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
22da0 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
22db0 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
22dc0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
22dd0 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
22de0 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
22df0 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
22e00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22e10 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
22e20 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
22e30 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
22e40 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
22e50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22e60 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
22e70 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
22e80 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
22e90 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
22ea0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22eb0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
22ec0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
22ed0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
22ee0 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
22ef0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
22f00 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22f10 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
22f20 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
22f30 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
22f40 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
22f50 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
22f60 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
22f70 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
22f80 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
22f90 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
22fa0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
22fb0 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
22fc0 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
22fd0 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
22fe0 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
22ff0 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
23000 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
23010 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
23020 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
23030 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
23040 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
23050 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
23060 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
23070 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  TabRef==1 ){.   
23080 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65     Parse *pTople
23090 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
230a0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
230b0 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  e);.      pTabTo
230c0 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65  Del->pNextZombie
230d0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a   = pToplevel->pZ
230e0 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
230f0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
23100 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65  ieTab = pTabToDe
23110 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
23120 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e      pTabToDel->n
23130 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a  TabRef--;.    }.
23140 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
23150 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ab = 0;.  }..  /
23160 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23170 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
23180 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  or each term in 
23190 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
231a0 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e  ery.  ** flatten
231b0 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65  ing (as describe
231c0 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65  d above).  If we
231d0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66   are doing a dif
231e0 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a  ferent kind.  **
231f0 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d   of flattening -
23200 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74   a flattening ot
23210 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f  her than a compo
23220 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
23230 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74  ttening -.  ** t
23240 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e  hen this loop on
23250 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20  ly runs once..  
23260 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
23270 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74  p moves all of t
23280 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
23290 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
232a0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   into the.  ** t
232b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
232c0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
232d0 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  y.  Before doing
232e0 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a   this, remember.
232f0 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
23300 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
23310 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
23320 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
23330 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74   in.  ** iParent
23340 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63  .  The iParent c
23350 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  ursor will never
23360 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65   be used.  Subse
23370 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20  quent code.  ** 
23380 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
23390 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
233a0 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
233b0 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
233c0 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65  .  ** those refe
233d0 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
233e0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
233f0 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
23400 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65  uery FROM.  ** e
23410 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e  lements we are n
23420 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20  ow copying in.. 
23430 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e   */.  for(pParen
23440 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50  t=p; pParent; pP
23450 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70  arent=pParent->p
23460 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62  Prior, pSub=pSub
23470 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69  ->pPrior){.    i
23480 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20  nt nSubSrc;.    
23490 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  u8 jointype = 0;
234a0 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70  .    pSubSrc = p
234b0 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  Sub->pSrc;     /
234c0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
234d0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
234e0 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
234f0 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75  rc->nSrc;  /* Nu
23500 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
23510 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63   subquery FROM c
23520 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72  lause */.    pSr
23530 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
23540 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
23550 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
23560 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20  er query */..   
23570 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20   if( pSrc ){.   
23580 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
23590 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72  nt==p );  /* Fir
235a0 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20  st time through 
235b0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
235c0 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75    jointype = pSu
235d0 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  bitem->fg.jointy
235e0 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pe;.    }else{. 
235f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
23600 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32  rent!=p );  /* 2
23610 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
23620 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20  t times through 
23630 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
23640 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
23650 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
23660 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
23670 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
23680 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
23690 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
236a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
236b0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d );.        bre
236c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
236d0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75  }..    /* The su
236e0 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69  bquery uses a si
236f0 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65  ngle slot of the
23700 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23710 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  the outer.    **
23720 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20   query.  If the 
23730 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72  subquery has mor
23740 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65  e than one eleme
23750 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  nt in its FROM c
23760 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  lause,.    ** th
23770 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  en expand the ou
23780 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b  ter query to mak
23790 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74  e space for it t
237a0 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65  o hold all eleme
237b0 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
237c0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
237d0 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
237e0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
237f0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23800 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20  M tabA, (SELECT 
23810 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62  * FROM sub1, sub
23820 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a  2), tabB;.    **
23830 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65  .    ** The oute
23840 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c  r query has 3 sl
23850 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ots in its FROM 
23860 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f  clause.  One slo
23870 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
23880 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65  outer query (the
23890 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73   middle slot) is
238a0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62   used by the sub
238b0 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74  query.  The next
238c0 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66  .    ** block of
238d0 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e   code will expan
238e0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
238f0 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f  y FROM clause to
23900 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a   4 slots..    **
23910 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74   The middle slot
23920 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20   is expanded to 
23930 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64  two slots in ord
23940 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  er to make space
23950 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
23960 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
23970 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23980 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
23990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
239a0 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
239b0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
239c0 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65   = pSrc = sqlite
239d0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
239e0 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72  db, pSrc, nSubSr
239f0 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20  c-1,iFrom+1);.  
23a00 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
23a10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
23a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23a30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
23a40 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52   Transfer the FR
23a50 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
23a60 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72  from the subquer
23a70 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  y into the.    *
23a80 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  * outer query.. 
23a90 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
23aa0 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  0; i<nSubSrc; i+
23ab0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
23ac0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
23ad0 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  , pSrc->a[i+iFro
23ae0 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m].pUsing);.    
23af0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
23b00 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73  a[i+iFrom].fg.is
23b10 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
23b20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
23b30 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
23b40 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77  a[i];.      iNew
23b50 50 61 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63  Parent = pSubSrc
23b60 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[i].iCursor;.
23b70 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
23b80 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
23b90 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
23ba0 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
23bb0 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d    pSrc->a[iFrom]
23bc0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  .fg.jointype = j
23bd0 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
23be0 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
23bf0 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
23c00 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
23c10 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
23c20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
23c30 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
23c40 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
23c50 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
23c60 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
23c70 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
23c80 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
23c90 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
23ca0 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
23cb0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
23cc0 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
23cf0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
23d00 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
23d10 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
23d20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23d30 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
23d40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23d50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
23d60 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
23d70 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
23d80 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
23d90 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
23da0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
23db0 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
23dc0 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
23dd0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
23de0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
23df0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
23e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23e10 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
23e20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68  {.      /* At th
23e30 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f  is point, any no
23e40 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43  n-zero iOrderByC
23e50 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61  ol values indica
23e60 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  te that the.    
23e70 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f    ** ORDER BY co
23e80 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
23e90 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20  is identical to 
23ea0 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27  the iOrderByCol'
23eb0 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  th.      ** expr
23ec0 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
23ed0 62 79 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  by SELECT statem
23ee0 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20  ent pSub. Since 
23ef0 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20  these values.   
23f00 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63     ** do not nec
23f10 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70  essarily corresp
23f20 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ond to columns i
23f30 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
23f40 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20  nt pParent,.    
23f50 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62    ** zero them b
23f60 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e  efore transferin
23f70 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
23f80 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  lause..      **.
23f90 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69        ** Not doi
23fa0 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61 75 73  ng this may caus
23fb0 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20  e an error if a 
23fc0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
23fd0 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  to this.      **
23fe0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
23ff0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20  ts to flatten a 
24000 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
24010 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a  ry into pParent.
24020 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e        ** (the on
24030 6c 79 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  ly way this can 
24040 68 61 70 70 65 6e 20 69 73 20 69 66 20 74 68 65  happen is if the
24050 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
24060 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ery is.      ** 
24070 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f  currently part o
24080 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53  f pSub->pSrc). S
24090 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36  ee ticket [d11a6
240a0 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20  e908f].  */.    
240b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
240c0 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
240d0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72  derBy;.      for
240e0 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
240f0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
24100 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
24110 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
24120 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  ByCol = 0;.     
24130 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
24140 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
24150 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
24160 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
24170 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
24180 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
24190 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
241a0 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
241b0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
241c0 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b->pWhere, 0);. 
241d0 20 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69     if( isLeftJoi
241e0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74  n>0 ){.      set
241f0 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c  JoinExpr(pWhere,
24200 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20   iNewParent);.  
24210 20 20 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d    }.    pParent-
24220 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
24230 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68  3ExprAnd(db, pWh
24240 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  ere, pParent->pW
24250 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64  here);.    if( d
24260 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
24270 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73  =0 ){.      Subs
24280 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20  tContext x;.    
24290 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61    x.pParse = pPa
242a0 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61  rse;.      x.iTa
242b0 62 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20  ble = iParent;. 
242c0 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65       x.iNewTable
242d0 20 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20   = iNewParent;. 
242e0 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69       x.isLeftJoi
242f0 6e 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a  n = isLeftJoin;.
24300 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d        x.pEList =
24310 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSub->pEList;. 
24320 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
24330 28 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29  (&x, pParent, 0)
24340 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
24350 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
24360 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
24370 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
24380 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
24390 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
243a0 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
243b0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
243c0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
243d0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
243e0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
243f0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
24400 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
24410 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
24420 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
24430 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
24440 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
24450 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
24460 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
24470 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
24480 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
24490 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
244a0 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
244b0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
244c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
244d0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
244e0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
244f0 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
24500 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
24510 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
24520 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24530 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
24540 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
24550 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
24560 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
24570 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
24580 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
24590 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23  e(db, pSub1);..#
245a0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
245b0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
245c0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
245d0 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
245e0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
245f0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
24600 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22  r flattening:\n"
24610 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
24620 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
24630 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
24640 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  if..  return 1;.
24650 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
24660 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24670 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
24680 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
24690 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23  IT_VIEW) */....#
246a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
246b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
246c0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
246d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
246e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  /*.** Make copie
246f0 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48  s of relevant WH
24700 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
24710 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
24720 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  ery into.** the 
24730 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
24740 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70  subquery.  Examp
24750 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  le:.**.**    SEL
24760 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
24770 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
24780 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S y FROM t1) WHE
24790 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
247a0 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  .**.** Transform
247b0 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ed into:.**.**  
247c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
247d0 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
247e0 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
247f0 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63   WHERE a=5 AND c
24800 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48  -d=10).**     WH
24810 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
24820 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65  ;.**.** The hope
24830 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72   is that the ter
24840 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ms added to the 
24850 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c  inner query will
24860 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a   make it more.**
24870 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
24880 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
24890 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
248a0 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  on if:.**.**   (
248b0 31 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74  1) (** This rest
248c0 72 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f  riction was remo
248d0 76 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32  ved on 2017-09-2
248e0 39 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a  9.  We used to.*
248f0 2a 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61  *           disa
24900 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69  llow this optimi
24910 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65  zation for aggre
24920 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c  gate subqueries,
24930 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20   but now.**     
24940 20 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f        it is allo
24950 77 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74  wed by putting t
24960 68 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  he extra terms o
24970 6e 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  n the HAVING cla
24980 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  use..**         
24990 20 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49    The added HAVI
249a0 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69  NG clause is poi
249b0 6e 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75  ntless if the su
249c0 62 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20  bquery lacks.** 
249d0 20 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55            a GROU
249e0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75  P BY clause.  Bu
249f0 74 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20  t such a HAVING 
24a00 63 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68  clause is also h
24a10 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20  armless.**      
24a20 20 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f       so there do
24a30 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f  es not appear to
24a40 20 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74   be any reason t
24a50 6f 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69  o add extra logi
24a60 63 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  c.**           t
24a70 6f 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a  o suppress it. *
24a80 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54  *).**.**   (2) T
24a90 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
24aa0 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
24ab0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e  part of a common
24ac0 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
24ad0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54  n..**.**   (3) T
24ae0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68  he inner query h
24af0 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
24b00 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61  e (since the cha
24b10 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52  nges to the WHER
24b20 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65  E.**       close
24b30 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68   would change th
24b40 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
24b50 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20   LIMIT)..**.**  
24b60 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (4) The inner q
24b70 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
24b80 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
24b90 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65  EFT JOIN and the
24ba0 0a 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65 73  .**       expres
24bb0 73 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65  sion to be pushe
24bc0 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20  d down does not 
24bd0 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  come from the ON
24be0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
24bf0 20 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f   on that LEFT JO
24c00 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  IN..**.**   (5) 
24c10 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
24c20 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
24c30 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e  inates in the ON
24c40 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
24c50 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c  .**       of a L
24c60 45 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69  EFT JOIN where i
24c70 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68  Cursor is not th
24c80 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62  e right-hand tab
24c90 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20  le of that.**   
24ca0 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20      left join.  
24cb0 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  An example:.**.*
24cc0 2a 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45  *           SELE
24cd0 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  CT *.**         
24ce0 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31    FROM (SELECT 1
24cf0 20 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c   AS a1 UNION ALL
24d00 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 61 61   SELECT 2) AS aa
24d10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f  .**           JO
24d20 49 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53 20  IN (SELECT 1 AS 
24d30 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  b2 UNION ALL SEL
24d40 45 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20  ECT 2) AS bb ON 
24d50 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20  (a1=b2).**      
24d60 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28       LEFT JOIN (
24d70 53 45 4c 45 43 54 20 38 20 41 53 20 63 33 20 55  SELECT 8 AS c3 U
24d80 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
24d90 39 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d  9) AS cc ON (b2=
24da0 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  2);.**.**       
24db0 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  The correct answ
24dc0 65 72 20 69 73 20 74 68 72 65 65 20 72 6f 77 73  er is three rows
24dd0 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32  :  (1,1,NULL),(2
24de0 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a  ,2,8),(2,2,9)..*
24df0 2a 20 20 20 20 20 20 20 42 75 74 20 69 66 20 74  *       But if t
24e00 68 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77  he (b2=2) term w
24e10 65 72 65 20 74 6f 20 62 65 20 70 75 73 68 65 64  ere to be pushed
24e20 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62   down into the b
24e30 62 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20  b subquery,.**  
24e40 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 28 31       then the (1
24e50 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75  ,1,NULL) row wou
24e60 6c 64 20 62 65 20 73 75 70 70 72 65 73 73 65 64  ld be suppressed
24e70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
24e80 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61   if no changes a
24e90 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d  re made and non-
24ea0 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d  zero if one or m
24eb0 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
24ec0 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75  .** terms are du
24ed0 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68  plicated into th
24ee0 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
24ef0 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f  tatic int pushDo
24f00 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20  wnWhereTerms(.  
24f10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
24f20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
24f30 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c  ontext (for mall
24f40 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72  oc() and error r
24f50 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53  eporting) */.  S
24f60 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
24f70 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
24f80 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
24f90 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
24fa0 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
24fb0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
24fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
24fd0 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
24fe0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
24ff0 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20    int iCursor,  
25000 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
25010 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
25020 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
25030 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20  t isLeftJoin    
25040 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
25050 53 75 62 71 20 69 73 20 74 68 65 20 72 69 67 68  Subq is the righ
25060 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
25070 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78   JOIN */.){.  Ex
25080 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
25090 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28  nChng = 0;.  if(
250a0 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
250b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
250c0 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
250d0 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65  F_Recursive ) re
250e0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74  turn 0;  /* rest
250f0 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a  riction (2) */..
25100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25110 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  BUG.  /* Only th
25120 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
25130 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68  a compound can h
25140 61 76 65 20 61 20 57 49 54 48 20 63 6c 61 75 73  ave a WITH claus
25150 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a  e.  But make.  *
25160 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20  * sure no other 
25170 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64  terms are marked
25180 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e   SF_Recursive in
25190 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20   case something 
251a0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20  changes.  ** in 
251b0 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f  the future..  */
251c0 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  .  {.    Select 
251d0 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70  *pX;  .    for(p
251e0 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d  X=pSubq; pX; pX=
251f0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  pX->pPrior){.   
25200 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
25210 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52  selFlags & (SF_R
25220 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b  ecursive))==0 );
25230 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25240 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  f..  if( pSubq->
25250 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
25260 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
25270 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
25280 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
25290 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
252a0 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
252b0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
252c0 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
252d0 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68  q, pWhere->pRigh
252e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65     iCursor, isLe
25310 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68  ftJoin);.    pWh
25320 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
25330 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eft;.  }.  if( i
25340 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20  sLeftJoin.   && 
25350 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
25360 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
25370 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  oin)==0.        
25380 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67   || pWhere->iRig
25390 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75  htJoinTable!=iCu
253a0 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72  rsor).  ){.    r
253b0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
253c0 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20  riction (4) */. 
253d0 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
253e0 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
253f0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20  EP_FromJoin) && 
25400 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f  pWhere->iRightJo
25410 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72  inTable!=iCursor
25420 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
25430 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
25440 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (5) */.  }.  if
25450 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  ( sqlite3ExprIsT
25460 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68  ableConstant(pWh
25470 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b  ere, iCursor) ){
25480 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
25490 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29    while( pSubq )
254a0 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
254b0 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e  text x;.      pN
254c0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
254d0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
254e0 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
254f0 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
25500 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20  pNew, -1);.     
25510 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
25520 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
25530 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
25540 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
25550 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
25560 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
25570 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  0;.      x.pELis
25580 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73  t = pSubq->pELis
25590 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  t;.      pNew = 
255a0 73 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e  substExpr(&x, pN
255b0 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
255c0 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
255d0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
255e0 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e  .        pSubq->
255f0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
25600 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
25610 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76  >db, pSubq->pHav
25620 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ing, pNew);.    
25630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25640 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d   pSubq->pWhere =
25650 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
25660 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
25670 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
25680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25690 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
256a0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
256b0 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
256c0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
256d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
256e0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
256f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25700 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
25710 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73  .** The pFunc is
25720 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67   the only aggreg
25730 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  ate function in 
25740 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63  the query.  Chec
25750 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74  k to see.** if t
25760 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
25770 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
25780 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
25790 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
257a0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
257b0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
257c0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
257d0 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a  ation, then set.
257e0 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20  ** *ppMinMax to 
257f0 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  be an ORDER BY c
25800 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
25810 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
25820 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74  ation.** and ret
25830 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45  urn either WHERE
25840 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
25850 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
25860 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a  X depending on.*
25870 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20  * whether pFunc 
25880 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
25890 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  x() function..**
258a0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
258b0 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64   is not a candid
258c0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
258d0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
258e0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52  , return.** WHER
258f0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
25900 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
25910 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  zero)..**.** Thi
25920 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
25930 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  e called after a
25940 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
25950 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ns have been.** 
25960 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f  located but befo
25970 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  re their argumen
25980 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62  ts have been sub
25990 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67  jected to aggreg
259a0 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e  ate.** analysis.
259b0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
259c0 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65  nMaxQuery(sqlite
259d0 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75  3 *db, Expr *pFu
259e0 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  nc, ExprList **p
259f0 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
25a00 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
25a10 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
25a20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
25a30 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
25a40 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d  *pEList = pFunc-
25a50 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  >x.pList;    /* 
25a60 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
25a70 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
25a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
25a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25aa0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
25ab0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
25ac0 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78  on pFunc */.  Ex
25ad0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
25ae0 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
25af0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  ;..  assert( *pp
25b00 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61  MinMax==0 );.  a
25b10 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70  ssert( pFunc->op
25b20 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
25b30 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  N );.  if( pELis
25b40 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e  t==0 || pEList->
25b50 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
25b60 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20  n eRet;.  zFunc 
25b70 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65  = pFunc->u.zToke
25b80 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
25b90 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
25ba0 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
25bb0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
25bc0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f  ERBY_MIN;.    so
25bd0 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
25be0 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65  _SO_ASC;.  }else
25bf0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
25c00 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
25c10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74  )==0 ){.    eRet
25c20 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
25c30 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72  _MAX;.    sortOr
25c40 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
25c50 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DESC;.  }else{. 
25c60 20 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a     return eRet;.
25c70 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20    }.  *ppMinMax 
25c80 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
25c90 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
25ca0 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
25cb0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
25cc0 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  By!=0 || db->mal
25cd0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
25ce0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
25cf0 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
25d00 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64  tOrder = sortOrd
25d10 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65  er;.  return eRe
25d20 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
25d30 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
25d40 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
25d50 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
25d60 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
25d70 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
25d80 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
25d90 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
25da0 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
25db0 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
25dc0 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
25dd0 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
25de0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
25df0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
25e00 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
25e10 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
25e20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
25e30 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
25e40 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
25e50 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
25e60 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
25e70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
25e80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
25e90 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
25ea0 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
25eb0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
25ec0 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
25ed0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
25ee0 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
25ef0 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
25f00 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
25f10 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
25f20 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
25f30 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
25f40 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
25f50 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
25f60 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
25f70 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
25f80 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
25f90 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
25fa0 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
25fb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
25fc0 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
25fd0 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
25fe0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
25ff0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
26000 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
26010 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
26020 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
26030 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
26040 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
26050 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
26060 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
26070 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
26080 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
26090 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
260a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
260b0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
260c0 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
260d0 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
260e0 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
260f0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
26100 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
26110 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
26120 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
26130 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
26140 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
26150 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
26160 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
26170 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
26180 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
26190 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
261a0 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
261b0 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
261c0 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
261d0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
261e0 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
261f0 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
26200 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
26210 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
26220 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
26230 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
26240 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
26250 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
26260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
26270 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
26280 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
26290 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
262a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
262b0 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
262c0 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
262d0 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  om->fg.isIndexed
262e0 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  By ){.    Table 
262f0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
26300 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
26310 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f  IndexedBy = pFro
26320 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
26330 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
26340 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
26350 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
26360 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
26370 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
26380 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
26390 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20  xedBy); .       
263a0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
263b0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
263c0 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
263d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
263e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
263f0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
26400 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20  dexedBy, 0);.   
26410 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
26420 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
26430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26440 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
26450 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78   pFrom->pIBIndex
26460 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
26470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26480 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
26490 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
264a0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
264b0 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
264c0 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
264d0 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
264e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
264f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
26500 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
26510 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
26520 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
26530 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
26540 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
26550 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
26560 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
26570 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
26580 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
26590 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
265a0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
265b0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
265c0 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
265d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
265e0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
265f0 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
26600 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
26610 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
26620 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
26630 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
26640 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
26650 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
26660 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
26670 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
26680 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
26690 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
266a0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
266b0 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
266c0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
266d0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
266e0 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
266f0 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
26700 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
26710 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
26720 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
26730 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
26740 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
26750 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
26760 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
26770 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
26780 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
26790 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
267a0 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
267b0 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
267c0 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
267d0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
267e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
267f0 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
26800 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
26810 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
26820 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
26830 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
26840 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
26850 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
26860 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
26870 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
26880 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
26890 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
268a0 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
268b0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
268c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
268d0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
268e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
268f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
26900 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
26910 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
26920 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
26930 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
26940 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
26950 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
26960 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
26970 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
26980 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
26990 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
269a0 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
269b0 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
269c0 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
269d0 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
269e0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
269f0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
26a00 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
26a10 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
26a20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
26a30 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
26a40 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
26a50 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
26a60 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
26a70 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
26a80 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
26a90 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
26aa0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
26ab0 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
26ac0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
26ad0 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
26ae0 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
26af0 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
26b00 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
26b10 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
26b20 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
26b30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
26b40 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
26b50 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
26b60 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
26b70 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
26b80 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
26b90 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
26ba0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
26bb0 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
26bc0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
26bd0 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20  STERISK, 0));.  
26be0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
26bf0 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
26c00 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
26c10 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
26c20 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
26c30 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
26c40 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
26c50 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
26c60 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68   = 0;.  p->pWith
26c70 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
26c80 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
26c90 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28  und;.  assert( (
26ca0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
26cb0 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29  _Converted)==0 )
26cc0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
26cd0 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b  |= SF_Converted;
26ce0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
26cf0 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
26d00 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
26d10 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
26d20 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
26d30 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
26d40 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
26d50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
26d60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26d70 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74  term pFrom has t
26d80 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
26d90 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  tion.** argument
26da0 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
26db0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
26dc0 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
26dd0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
26de0 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70  on-zero, since p
26df0 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  From is not allo
26e00 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c  wed to be a tabl
26e10 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
26e20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
26e30 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
26e40 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
26e50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
26e60 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
26e70 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
26e80 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  TabFunc ){.    s
26e90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
26ea0 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20  Parse, "'%s' is 
26eb0 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c  not a function",
26ec0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pFrom->zName);.
26ed0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26ee0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
26ef0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26f00 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
26f10 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
26f20 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
26f30 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
26f40 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
26f50 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
26f60 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
26f70 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
26f80 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
26f90 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
26fa0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
26fb0 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
26fc0 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
26fd0 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
26fe0 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
26ff0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
27000 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
27010 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
27020 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
27030 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
27040 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
27050 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
27060 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
27070 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
27080 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
27090 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
270a0 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
270b0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
270c0 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
270d0 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
270e0 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
270f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
27100 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
27110 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
27120 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27130 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
27140 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
27150 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
27160 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
27170 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
27180 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
27190 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
271a0 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
271b0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
271c0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
271d0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
271e0 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
271f0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
27200 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
27210 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
27220 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
27230 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
27240 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
27250 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
27260 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
27270 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
27280 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
27290 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
272a0 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
272b0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
272c0 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
272d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
272e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
272f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
27300 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
27310 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
27320 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
27330 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
27340 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
27350 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
27360 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
27370 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
27380 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
27390 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
273a0 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
273b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
273c0 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
273d0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
273e0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
273f0 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
27400 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
27410 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
27420 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
27430 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
27440 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
27450 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
27460 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
27470 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
27480 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
27490 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
274a0 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
274b0 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
274c0 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
274d0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
274e0 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
274f0 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
27500 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
27510 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
27520 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
27530 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
27540 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
27550 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
27560 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
27570 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
27580 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
27590 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
275a0 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
275b0 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
275c0 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
275d0 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
275e0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
275f0 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
27600 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
27610 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
27620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
27630 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
27640 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
27650 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
27660 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
27670 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
27680 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
27690 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
276a0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
276b0 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
276c0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
276d0 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
276e0 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
276f0 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
27700 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
27710 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
27720 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
27730 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
27740 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
27750 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
27760 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
27770 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
27780 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
27790 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
277a0 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
277b0 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
277c0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
277d0 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
277e0 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
277f0 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
27800 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
27810 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
27820 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27830 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
27840 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
27850 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
27860 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
27870 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
27880 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
27890 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
278a0 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
278b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
278c0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
278d0 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
278e0 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
278f0 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
27900 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
27910 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
27920 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
27930 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
27940 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
27950 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
27960 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
27970 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
27980 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
27990 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
279a0 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279c0 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
279d0 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
279e0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
279f0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
27a00 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
27a10 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
27a20 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
27a30 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
27a40 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
27a50 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
27a60 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
27a70 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
27a80 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27aa0 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
27ab0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
27ac0 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
27ad0 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
27ae0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
27af0 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
27b00 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
27b10 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
27b20 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
27b30 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
27b40 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
27b50 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
27b60 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
27b70 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
27b80 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
27b90 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
27ba0 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
27bb0 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
27bc0 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
27bd0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
27be0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
27bf0 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
27c00 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
27c10 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
27c20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
27c30 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
27c40 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
27c50 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
27c60 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
27c70 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
27c80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27c90 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
27ca0 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
27cb0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
27cc0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
27cd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e     }.    if( can
27ce0 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
27cf0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72  arse, pFrom) ) r
27d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27d10 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  OR;..    assert(
27d20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
27d30 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
27d40 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
27d50 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
27d60 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
27d70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
27d80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
27d90 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
27da0 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
27db0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
27dc0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
27dd0 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
27de0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
27df0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
27e00 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
27e10 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
27e20 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
27e30 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
27e40 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
27e50 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c  = TF_Ephemeral |
27e60 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
27e70 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  id;.    pFrom->p
27e80 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
27e90 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
27ea0 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
27eb0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
27ec0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
27ed0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
27ee0 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
27ef0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
27f00 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
27f10 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
27f20 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
27f30 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
27f40 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
27f50 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
27f60 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
27f70 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
27f80 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
27f90 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
27fa0 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
27fb0 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
27fc0 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
27fd0 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
27fe0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
27ff0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
28000 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
28010 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
28020 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
28030 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
28040 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
28050 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
28060 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
28070 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
28080 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
28090 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
280a0 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
280b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
280c0 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
280d0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
280e0 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
280f0 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
28100 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
28110 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
28120 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
28130 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
28140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
28160 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
28170 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
28180 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
28190 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62    if( pTab->nTab
281a0 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
281b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
281c0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
281d0 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
281e0 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
281f0 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
28200 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
28210 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
28220 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
28230 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
28240 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  ( pTab->nTabRef=
28250 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =1 || .         
28260 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c     ((pSel->selFl
28270 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
28280 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52  ) && pTab->nTabR
28290 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
282a0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
282b0 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
282c0 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61  ce: %s";.    pSa
282d0 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65  vedWith = pParse
282e0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
282f0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
28300 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  th;.    if( bMay
28310 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
28320 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
28330 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  r = pSel->pPrior
28340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28350 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30  pPrior->pWith==0
28360 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
28370 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e  ->pWith = pSel->
28380 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c  pWith;.      sql
28390 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
283a0 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b  Walker, pPrior);
283b0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
283c0 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65  With = 0;.    }e
283d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
283e0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
283f0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
28400 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
28410 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20  With = pWith;.. 
28420 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
28430 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
28440 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
28450 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
28460 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
28470 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
28480 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
28490 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
284a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
284b0 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
284c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
284d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
284e0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
284f0 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
28500 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
28510 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
28520 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
28530 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
28540 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
28550 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
28560 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
28570 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
28580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
28590 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
285a0 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
285b0 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
285c0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
285d0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
285e0 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70  arse, pEList, &p
285f0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
28600 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  ->aCol);.    if(
28610 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
28620 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  {.      if( pSel
28630 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28640 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
28650 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
28660 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
28670 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
28680 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
28690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
286a0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
286b0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
286c0 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
286d0 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
286e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
286f0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
28700 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
28710 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
28720 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
28730 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
28740 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
28750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28760 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
28770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
28780 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
28790 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
287a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
287b0 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
287c0 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
287d0 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
287e0 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
287f0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
28800 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
28810 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
28820 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
28830 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
28840 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
28850 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
28860 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
28870 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
28880 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
28890 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
288a0 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
288b0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
288c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
288d0 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
288e0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
288f0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
28900 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
28910 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
28920 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
28930 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69  TRUE(pParse->pWi
28940 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  th) && p->pPrior
28950 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  ==0 ){.    With 
28960 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
28970 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
28980 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21  ;.    if( pWith!
28990 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
289a0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
289b0 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
289c0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
289d0 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
289e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
289f0 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
28a00 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
28a10 66 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  f..int sqlite3Ex
28a20 70 61 6e 64 53 75 62 71 75 65 72 79 28 50 61 72  pandSubquery(Par
28a30 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
28a40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28a50 2a 70 46 72 6f 6d 29 7b 0a 20 20 53 65 6c 65 63  *pFrom){.  Selec
28a60 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
28a70 3e 70 53 65 6c 65 63 74 3b 0a 20 20 54 61 62 6c  >pSelect;.  Tabl
28a80 65 20 2a 70 54 61 62 3b 0a 0a 20 20 70 46 72 6f  e *pTab;..  pFro
28a90 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
28aa0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
28ab0 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
28ac0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
28ad0 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
28ae0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
28af0 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52  t;.  pTab->nTabR
28b00 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 46  ef = 1;.  if( pF
28b10 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  rom->zAlias ){. 
28b20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
28b30 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
28b40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 46 72  (pParse->db, pFr
28b50 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d  om->zAlias);.  }
28b60 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 2d 3e  else{.    pTab->
28b70 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
28b80 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
28b90 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 70 22  b, "subquery_%p"
28ba0 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
28bb0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65    }.  while( pSe
28bc0 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
28bd0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
28be0 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  ; }.  sqlite3Col
28bf0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
28c00 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
28c10 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f  EList,&pTab->nCo
28c20 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  l,&pTab->aCol);.
28c30 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
28c40 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77  -1;.  pTab->nRow
28c50 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
28c60 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
28c70 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
28c80 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61 62  ) );.  pTab->tab
28c90 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
28ca0 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75 72 6e  meral;..  return
28cb0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28cc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28cd0 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72  tine is a Walker
28ce0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65   callback for "e
28cf0 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45  xpanding" a SELE
28d00 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
28d10 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61   "Expanding" mea
28d20 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c  ns to do the fol
28d30 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
28d40 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
28d50 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
28d60 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
28d70 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
28d80 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
28d90 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
28da0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
28db0 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
28dc0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
28dd0 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
28de0 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
28df0 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
28e00 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
28e10 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
28e20 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
28e30 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
28e40 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
28e50 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
28e60 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
28e70 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28e80 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
28e90 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
28ea0 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
28eb0 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
28ec0 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
28ed0 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
28ee0 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
28ef0 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
28f00 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
28f10 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
28f20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
28f30 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
28f40 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  up the persisten
28f50 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
28f60 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
28f70 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
28f80 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
28f90 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
28fa0 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ause to accommod
28fb0 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
28fc0 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
28fd0 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
28fe0 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
28ff0 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
29000 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
29010 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
29020 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
29030 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
29040 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
29050 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
29060 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
29070 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
29080 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
29090 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
290a0 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
290b0 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
290c0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
290d0 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
290e0 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
290f0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
29100 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
29110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
29120 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
29130 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
29140 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
29150 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
29160 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
29170 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
29180 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
29190 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
291a0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
291b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
291c0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
291d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
291e0 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
291f0 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
29200 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
29210 73 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20  selFlags;.  u32 
29220 65 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a  elistFlags = 0;.
29230 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
29240 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
29250 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
29260 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
29270 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
29280 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
29290 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66  >pSrc!=0 );.  if
292a0 28 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  ( (selFlags & SF
292b0 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
292c0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
292d0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
292e0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
292f0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
29300 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  EList;.  sqlite3
29310 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c  WithPush(pParse,
29320 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a   p->pWith, 0);..
29330 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
29340 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
29350 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
29360 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
29370 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
29380 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
29390 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
293a0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
293b0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
293c0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
293d0 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
293e0 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
293f0 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
29400 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
29410 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
29420 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
29430 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
29440 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
29450 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
29460 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
29470 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
29480 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
29490 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
294a0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
294b0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
294c0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
294d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
294e0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
294f0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
29500 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
29510 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
29520 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f  rsive==0 || pFro
29530 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  m->pTab!=0 );.  
29540 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
29550 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
29560 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
29570 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
29580 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
29590 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
295a0 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
295b0 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
295c0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
295d0 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
295e0 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
295f0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
29600 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
29610 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
29620 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
29630 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
29640 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
29650 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
29660 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
29670 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
29680 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
29690 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
296a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
296b0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
296c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
296d0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
296e0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
296f0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
29700 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
29710 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
29720 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 46  query(pParse, pF
29730 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
29740 43 5f 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a  C_Abort;.#endif.
29750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29760 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
29770 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
29780 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
29790 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
297a0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
297b0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
297c0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
297d0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
297e0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
297f0 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
29800 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
29810 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
29820 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
29830 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66  ab->nTabRef>=0xf
29840 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
29850 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
29860 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
29870 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
29880 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
29890 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
298a0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
298b0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
298c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
298d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
298e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
298f0 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
29900 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
29910 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e  al(pTab) && cann
29920 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
29930 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
29940 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
29950 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
29960 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
29970 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
29980 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
29990 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
299a0 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
299b0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
299c0 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
299d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  t ){.        i16
299e0 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
299f0 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
29a00 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
29a10 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
29a20 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29a40 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
29a50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
29a60 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
29a70 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
29a80 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
29a90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
29aa0 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
29ab0 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  e(pFrom->pSelect
29ac0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
29ad0 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
29ae0 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
29af0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
29b00 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -1;.        sqli
29b10 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
29b20 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
29b30 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
29b40 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
29b50 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
29b60 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
29b70 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
29b80 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
29b90 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
29ba0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
29bb0 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
29bc0 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
29bd0 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
29be0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
29bf0 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
29c00 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
29c10 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
29c20 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
29c30 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
29c40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
29c50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
29c60 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
29c70 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
29c80 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
29c90 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
29ca0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
29cb0 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
29cc0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
29cd0 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
29ce0 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
29cf0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
29d00 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
29d10 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
29d20 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
29d30 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
29d40 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
29d50 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
29d60 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
29d70 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
29d80 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65   TK_ASTERISK ope
29d90 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
29da0 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
29db0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   in the column. 
29dc0 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66   ** list.  The f
29dd0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
29de0 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
29df0 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
29e00 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
29e10 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63  s and expand eac
29e20 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
29e30 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
29e40 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62   in.  ** all tab
29e50 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
29e60 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
29e70 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
29e80 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
29e90 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
29ea0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
29eb0 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
29ec0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
29ed0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
29ee0 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
29ef0 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
29f00 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
29f10 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
29f20 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
29f30 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
29f40 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
29f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
29f60 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
29f70 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
29f80 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
29f90 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
29fa0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
29fb0 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
29fc0 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
29fd0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69  ) break;.    eli
29fe0 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
29ff0 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
2a000 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
2a010 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2a020 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
2a030 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
2a040 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
2a050 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
2a060 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
2a070 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
2a080 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
2a090 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
2a0a0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2a0b0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
2a0c0 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
2a0d0 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
2a0e0 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
2a0f0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2a100 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
2a110 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
2a120 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
2a130 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
2a140 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
2a150 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
2a160 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
2a170 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a190 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
2a1a0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
2a1b0 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
2a1c0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
2a1d0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
2a1e0 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
2a1f0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69  pExpr;.      eli
2a200 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
2a210 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67  lags;.      pRig
2a220 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
2a230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a240 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
2a250 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2a260 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
2a270 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
2a280 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
2a290 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
2a2a0 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
2a2b0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2a2c0 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
2a2d0 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
2a2e0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2a2f0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
2a300 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a310 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2a320 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
2a330 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
2a340 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2a350 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
2a360 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
2a370 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
2a380 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
2a390 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
2a3a0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
2a3b0 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
2a3c0 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
2a3d0 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
2a3e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
2a3f0 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
2a400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
2a410 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
2a420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a430 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
2a440 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
2a450 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
2a460 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
2a470 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
2a480 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
2a490 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
2a4a0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
2a4b0 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
2a4c0 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
2a4d0 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
2a4e0 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
2a4f0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
2a500 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2a510 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
2a520 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2a530 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
2a540 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
2a550 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2a560 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
2a570 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
2a580 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
2a590 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
2a5a0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
2a5b0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
2a5c0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
2a5d0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
2a5e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2a5f0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
2a600 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
2a610 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
2a620 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
2a630 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
2a640 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
2a650 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
2a660 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
2a670 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
2a680 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
2a690 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
2a6a0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
2a6b0 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
2a6c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2a6d0 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
2a6e0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
2a6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a700 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2a710 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
2a720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2a730 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
2a740 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
2a750 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
2a760 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
2a770 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2a780 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
2a790 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2a7a0 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
2a7b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2a7c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2a7d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a7e0 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
2a7f0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2a800 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
2a810 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
2a820 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
2a830 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
2a840 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
2a850 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
2a860 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
2a870 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
2a880 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
2a890 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2a8a0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
2a8b0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2a8c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
2a8d0 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
2a8e0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
2a8f0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
2a900 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
2a910 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
2a920 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
2a930 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
2a940 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
2a950 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
2a960 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
2a970 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
2a980 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
2a990 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
2a9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a9b0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
2a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2a9d0 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
2a9e0 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
2a9f0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
2aa00 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2aa30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2aa40 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
2aa50 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
2aa60 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
2aa70 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
2aa80 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
2aa90 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
2aaa0 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
2aab0 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
2aac0 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
2aad0 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
2aae0 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
2aaf0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
2ab00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2ab10 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2ab20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
2ab30 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
2ab40 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
2ab50 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
2ab60 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
2ab70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2ab80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2ab90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2aba0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
2abb0 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
2abc0 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
2abd0 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
2abe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2abf0 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
2ac00 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
2ac10 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2ac20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
2ac30 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
2ac40 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
2ac50 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
2ac60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2ac70 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
2ac80 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
2ac90 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
2aca0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
2acb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
2acc0 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
2acd0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2ad00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ad10 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2ad20 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
2ad30 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
2ad40 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
2ad50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ad60 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
2ad70 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
2ad80 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
2ad90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ada0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
2adb0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2adc0 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
2add0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ade0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2adf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ae00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ae10 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
2ae20 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2ae30 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
2ae40 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
2ae50 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
2ae60 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
2ae70 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2ae80 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
2ae90 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
2aea0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2aeb0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
2aed0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
2aee0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
2aef0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
2af00 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
2af10 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2af20 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
2af30 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
2af40 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
2af50 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
2af60 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2af70 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2af80 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
2af90 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
2afa0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2afb0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2afc0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2afd0 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
2afe0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2aff0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
2b000 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
2b010 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2b020 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
2b030 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
2b040 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
2b050 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2b060 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
2b070 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
2b080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b0a0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2b0b0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
2b0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b0d0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2b0e0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2b0f0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
2b100 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2b110 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
2b120 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
2b130 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
2b140 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b150 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
2b160 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
2b170 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
2b180 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
2b190 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2b1a0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
2b1b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b1c0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2b1d0 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
2b1e0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2b1f0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
2b200 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
2b210 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b220 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
2b230 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
2b240 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2b250 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
2b260 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2b270 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
2b280 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2b290 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2b2b0 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
2b2c0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
2b2d0 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b300 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
2b310 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
2b320 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2b330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2b340 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
2b350 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b360 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2b370 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
2b380 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b390 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b3a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
2b3b0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
2b3c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b3d0 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
2b3e0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2b3f0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
2b400 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b410 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b420 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2b430 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
2b440 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2b450 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2b460 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2b470 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
2b480 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
2b490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b4a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2b4b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2b4c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2b4d0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
2b4e0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
2b4f0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  }.  if( p->pELis
2b500 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  t ){.    if( p->
2b510 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
2b520 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
2b530 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
2b540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2b550 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2b560 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
2b570 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
2b580 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2b590 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
2b5a0 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c      if( (elistFl
2b5b0 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e  ags & (EP_HasFun
2b5c0 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29 21  c|EP_Subquery))!
2b5d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
2b5e0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f  elFlags |= SF_Co
2b5f0 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20  mplexResult;.   
2b600 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2b610 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2b620 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2b630 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2b640 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
2b650 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2b660 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
2b670 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2b680 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
2b690 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
2b6a0 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
2b6b0 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
2b6c0 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
2b6d0 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
2b6e0 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
2b6f0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2b700 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
2b710 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
2b720 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
2b730 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
2b740 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
2b750 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
2b760 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
2b770 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
2b780 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b790 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  ExprWalkNoop(Wal
2b7a0 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
2b7b0 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
2b7c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b7d0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2b7e0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
2b7f0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2b800 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2b810 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2b820 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66  se-tree walker f
2b830 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
2b840 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72  ents..** subquer
2b850 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
2b860 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
2b870 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
2b880 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
2b890 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
2b8a0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2b8b0 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2b8c0 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2b8d0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2b8e0 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  inue;.}..#if SQL
2b8f0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2b900 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20 20  Always assert.  
2b910 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c  This xSelectCall
2b920 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61  back2 implementa
2b930 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74  tion proves that
2b940 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43   the.** xSelectC
2b950 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65  allback2 is neve
2b960 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f  r invoked..*/.vo
2b970 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2b980 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b  WalkAssert2(Walk
2b990 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
2b9a0 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
2b9b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b9c0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2b9d0 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74  Used2);.  assert
2b9e0 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ( 0 );.}.#endif.
2b9f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2ba00 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
2ba10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2ba20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
2ba30 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
2ba40 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2ba50 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
2ba60 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
2ba70 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
2ba80 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
2ba90 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
2baa0 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
2bab0 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
2bac0 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
2bad0 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
2bae0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
2baf0 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
2bb00 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
2bb10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2bb20 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
2bb30 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
2bb40 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
2bb50 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
2bb60 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
2bb70 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
2bb80 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
2bb90 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2bba0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2bbb0 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
2bbc0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2bbd0 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
2bbe0 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
2bbf0 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
2bc00 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or 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 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
2bc30 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2bc40 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
2bc50 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2bc60 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
2bc70 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2bc80 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2bc90 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
2bca0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
2bcb0 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
2bcc0 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
2bcd0 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29  se->hasCompound)
2bce0 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
2bcf0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
2bd00 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
2bd10 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
2bd20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2bd30 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ck2 = 0;.    sql
2bd40 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2bd50 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
2bd60 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2bd70 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
2bd80 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
2bd90 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2bda0 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
2bdb0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2bdc0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
2bdd0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2bde0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2bdf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
2be00 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2be10 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
2be20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
2be30 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
2be40 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
2be50 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
2be60 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2be70 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
2be80 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
2be90 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
2bea0 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
2beb0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2bec0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2bed0 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
2bee0 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
2bef0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
2bf00 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
2bf10 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
2bf20 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
2bf30 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
2bf40 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
2bf50 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
2bf60 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
2bf70 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
2bf80 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
2bf90 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
2bfa0 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
2bfb0 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
2bfc0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2bfd0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
2bfe0 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
2bff0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
2c000 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
2c010 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
2c020 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
2c030 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2c040 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2c050 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
2c060 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
2c070 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2c080 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
2c090 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
2c0a0 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
2c0b0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
2c0c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2c0d0 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
2c0e0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
2c0f0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
2c100 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2c110 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2c120 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2c130 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
2c140 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2c150 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2c160 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2c170 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
2c180 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
2c190 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
2c1a0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2c1b0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2c1c0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2c1d0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
2c1e0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
2c1f0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2c200 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
2c210 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2c220 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2c230 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
2c240 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
2c250 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
2c260 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
2c270 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
2c280 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2c290 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
2c2a0 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
2c2b0 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
2c2c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2c2d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2c2e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
2c2f0 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
2c300 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2c310 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
2c320 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
2c330 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
2c340 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
2c350 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
2c360 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2c370 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
2c380 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
2c390 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
2c3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c3b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2c3c0 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
2c3d0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2c3e0 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
2c3f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2c400 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
2c410 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
2c420 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2c430 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
2c440 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2c450 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
2c460 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2c470 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2c480 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2c490 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2c4a0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2c4b0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2c4c0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2c4d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
2c4e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2c4f0 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
2c500 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
2c510 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
2c520 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
2c530 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
2c540 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
2c550 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
2c560 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
2c570 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
2c580 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
2c590 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
2c5a0 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
2c5b0 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
2c5c0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2c5d0 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
2c5e0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2c5f0 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
2c600 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
2c610 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
2c620 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
2c630 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
2c640 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
2c650 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
2c660 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
2c670 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
2c680 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
2c690 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2c6a0 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
2c6b0 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
2c6c0 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
2c6d0 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
2c6e0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2c6f0 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
2c700 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2c710 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2c720 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2c730 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2c740 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2c750 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2c760 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
2c770 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
2c780 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
2c790 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
2c7a0 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
2c7b0 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p!=0 || pParse-
2c7c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2c7d0 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  d );.  if( pPars
2c7e0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2c7f0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2c800 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2c810 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2c820 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2c830 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2c840 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
2c850 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2c860 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2c870 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2c880 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
2c890 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
2c8a0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
2c8b0 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
2c8c0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2c8d0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2c8e0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2c8f0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2c900 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
2c910 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
2c920 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
2c930 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2c940 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
2c950 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2c960 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
2c970 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
2c980 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
2c990 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
2c9a0 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
2c9b0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
2c9c0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
2c9d0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
2c9e0 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
2c9f0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
2ca00 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
2ca10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2ca20 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2ca30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2ca40 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2ca50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2ca60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2ca70 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2ca80 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2ca90 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
2caa0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
2cab0 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
2cac0 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
2cad0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
2cae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2caf0 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
2cb00 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
2cb10 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
2cb20 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
2cb30 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
2cb40 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
2cb50 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
2cb60 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
2cb70 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2cb80 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
2cb90 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
2cba0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
2cbb0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2cbc0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2cbd0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
2cbe0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2cbf0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2cc00 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2cc10 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2cc20 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2cc30 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2cc40 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2cc50 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2cc60 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2cc70 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2cc80 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2cc90 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2cca0 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2ccb0 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2ccc0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2ccd0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2cce0 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2ccf0 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2cd00 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2cd10 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2cd20 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2cd30 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2cd40 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2cd50 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2cd60 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2cd70 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2cd80 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2cd90 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2cda0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2cdb0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2cdc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2cdd0 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2cde0 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2cdf0 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2ce00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ce10 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2ce20 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2ce30 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2ce40 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2ce50 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2ce60 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2ce70 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2ce80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ce90 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2cea0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
2ceb0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2cec0 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
2ced0 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  ist,0,0);.      
2cee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cef0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2cf00 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
2cf10 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
2cf20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cf30 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2cf40 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2cf50 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
2cf60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2cf70 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f  .** Invoke the O
2cf80 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70  P_AggFinalize op
2cf90 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61  code for every a
2cfa0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2cfb0 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49  n.** in the AggI
2cfc0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
2cfd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
2cfe0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2cff0 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ns(Parse *pParse
2d000 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
2d010 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
2d020 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2d030 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2d040 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2d050 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *pF;.  for(i=0, 
2d060 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
2d070 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
2d080 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
2d090 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
2d0a0 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
2d0b0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
2d0c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2d0d0 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
2d0e0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2d0f0 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t) );.    sqlite
2d100 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d110 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
2d120 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
2d130 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
2d140 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2d150 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2d160 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2d170 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
2d180 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
2d190 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
2d1a0 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
2d1b0 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
2d1c0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
2d1d0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
2d1e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
2d1f0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
2d200 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2d210 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2d220 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2d230 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2d240 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67  int i;.  int reg
2d250 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  Hit = 0;.  int a
2d260 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a  ddrHitTest = 0;.
2d270 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2d280 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
2d290 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
2d2a0 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
2d2b0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
2d2c0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
2d2d0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
2d2e0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2d2f0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
2d300 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
2d310 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
2d320 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
2d330 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
2d340 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
2d350 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
2d360 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2d370 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
2d380 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2d390 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
2d3a0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
2d3b0 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
2d3c0 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
2d3d0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2d3e0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
2d3f0 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
2d400 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2d410 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
2d420 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c  , regAgg, 0, SQL
2d430 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
2d440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d450 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
2d460 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
2d470 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
2d480 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2d490 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
2d4a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2d4b0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
2d4c0 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20  stcase( nArg==0 
2d4d0 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e  );  /* Error con
2d4e0 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  dition */.      
2d4f0 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31  testcase( nArg>1
2d500 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e   );   /* Also an
2d510 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
2d520 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
2d530 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
2d540 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
2d550 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
2d560 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
2d570 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
2d580 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
2d590 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
2d5a0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
2d5b0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
2d5c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2d5d0 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
2d5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d5f0 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
2d600 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
2d610 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
2d620 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
2d630 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
2d640 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
2d650 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
2d660 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
2d670 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2d680 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2d690 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
2d6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d6b0 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
2d6c0 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
2d6d0 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
2d6e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d6f0 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
2d700 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
2d710 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
2d720 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2d730 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
2d740 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2d750 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
2d760 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
2d770 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
2d780 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
2d790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2d7a0 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20  v, OP_AggStep0, 
2d7b0 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
2d7c0 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Mem);.    sqlite
2d7d0 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
2d7e0 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46   pF->pFunc, P4_F
2d7f0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
2d800 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2d810 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20  (v, (u8)nArg);. 
2d820 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2d830 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
2d840 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
2d850 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
2d860 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2d870 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
2d880 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
2d890 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
2d8a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d8b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2d8c0 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
2d8d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2d8e0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2d8f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2d900 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69   Before populati
2d910 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
2d920 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c  or registers, cl
2d930 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  ear the column c
2d940 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ache..  ** Other
2d950 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20  wise, if any of 
2d960 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
2d970 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61  umn values are a
2d980 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a  lready present .
2d990 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72    ** in register
2d9a0 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  s, sqlite3ExprCo
2d9b0 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f  de() may use OP_
2d9c0 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68  SCopy to copy th
2d9d0 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20  e value.  ** to 
2d9e0 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79  pC->iMem. But by
2d9f0 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61   the time the va
2da00 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  lue is used, the
2da10 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74   original regist
2da20 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  er.  ** may have
2da30 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61   been used, inva
2da40 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64  lidating the und
2da50 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68  erlying buffer h
2da60 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  olding the.  ** 
2da70 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c  text or blob val
2da80 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  ue. See ticket [
2da90 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a  883034dcb5]..  *
2daa0 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73  *.  ** Another s
2dab0 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  olution would be
2dac0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f   to change the O
2dad0 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20  P_SCopy used to 
2dae0 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a  copy cached.  **
2daf0 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50   values to an OP
2db00 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  _Copy..  */.  if
2db10 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20  ( regHit ){.    
2db20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71  addrHitTest = sq
2db30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2db40 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74  v, OP_If, regHit
2db50 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2db60 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
2db70 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2db80 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
2db90 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
2dba0 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
2dbb0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
2dbc0 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
2dbd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2dbe0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
2dbf0 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
2dc00 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
2dc10 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
2dc20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2dc30 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2dc40 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73    if( addrHitTes
2dc50 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2dc60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2dc70 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20  addrHitTest);.  
2dc80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
2dc90 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61   single OP_Expla
2dca0 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  in instruction t
2dcb0 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78  o the VDBE to ex
2dcc0 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a  plain a simple.*
2dcd0 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79  * count(*) query
2dce0 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   ("SELECT count(
2dcf0 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a  *) FROM pTab")..
2dd00 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2dd10 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73  E_OMIT_EXPLAIN.s
2dd20 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
2dd30 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20  inSimpleCount(. 
2dd40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd60 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
2dd70 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
2dd80 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
2dd90 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
2dda0 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
2ddb0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
2dde0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61   to optimize sca
2ddf0 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  n, or NULL */.){
2de00 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
2de10 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
2de20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70   int bCover = (p
2de30 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f  Idx!=0 && (HasRo
2de40 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73  wid(pTab) || !Is
2de50 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
2de60 70 49 64 78 29 29 29 3b 0a 20 20 20 20 73 71 6c  pIdx)));.    sql
2de70 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28  ite3VdbeExplain(
2de80 70 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e  pParse, 0, "SCAN
2de90 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a   TABLE %s%s%s",.
2dea0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
2deb0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f  ame,.        bCo
2dec0 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f  ver ? " USING CO
2ded0 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a  VERING INDEX " :
2dee0 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f   "",.        bCo
2def0 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d  ver ? pIdx->zNam
2df00 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20  e : "".    );.  
2df10 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
2df20 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
2df30 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
2df40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  dif../*.** sqlit
2df50 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
2df60 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61  lback used by ha
2df70 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a  vingToWhere()..*
2df80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65  *.** If the node
2df90 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63   passed to the c
2dfa0 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f  allback is a TK_
2dfb0 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e  AND node, return
2dfc0 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75   .** WRC_Continu
2dfd0 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65  e to tell sqlite
2dfe0 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69  3WalkExpr() to i
2dff0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63  terate through c
2e000 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  hild nodes..**.*
2e010 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
2e020 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49  urn WRC_Prune. I
2e030 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73  n this case, als
2e040 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a  o check if the .
2e050 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  ** sub-expressio
2e060 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72  n matches the cr
2e070 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67  iteria for being
2e080 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48   moved to the WH
2e090 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49  ERE.** clause. I
2e0a0 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20  f so, add it to 
2e0b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e0c0 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65   and replace the
2e0d0 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a   sub-expression.
2e0e0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41  ** within the HA
2e0f0 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2e100 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
2e110 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  "1"..*/.static i
2e120 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  nt havingToWhere
2e130 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
2e140 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2e150 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2e160 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b  r->op!=TK_AND ){
2e170 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20  .    Select *pS 
2e180 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
2e190 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71  lect;.    if( sq
2e1a0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2e1b0 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61  antOrGroupBy(pWa
2e1c0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45  lker->pParse, pE
2e1d0 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42  xpr, pS->pGroupB
2e1e0 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
2e1f0 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65  te3 *db = pWalke
2e200 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  r->pParse->db;. 
2e210 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
2e220 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
2e230 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
2e240 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
2e250 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  kens[1], 0);.   
2e260 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
2e270 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68         Expr *pWh
2e280 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65  ere = pS->pWhere
2e290 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45  ;.        SWAP(E
2e2a0 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78  xpr, *pNew, *pEx
2e2b0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  pr);.        pNe
2e2c0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2e2d0 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
2e2e0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53  New);.        pS
2e2f0 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b  ->pWhere = pNew;
2e300 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
2e310 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2e320 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2e330 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2e340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2e350 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2e360 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c  *.** Transfer el
2e370 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f  igible terms fro
2e380 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  m the HAVING cla
2e390 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20  use of a query, 
2e3a0 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63  which is.** proc
2e3b0 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75  essed after grou
2e3c0 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45  ping, to the WHE
2e3d0 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68  RE clause, which
2e3e0 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65   is processed be
2e3f0 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  fore.** grouping
2e400 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  . For example, t
2e410 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
2e420 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2e430 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2e440 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2e450 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f  VING b=? AND c=?
2e460 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65  .**.** can be re
2e470 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
2e480 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2e490 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45  M <tables> WHERE
2e4a0 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f   a=? AND b=? GRO
2e4b0 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
2e4c0 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20  =?.**.** A term 
2e4d0 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  of the HAVING ex
2e4e0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67  pression is elig
2e4f0 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65  ible for transfe
2e500 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73  r if it consists
2e510 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  .** entirely of 
2e520 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78  constants and ex
2e530 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
2e540 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59  re also GROUP BY
2e550 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75   terms that.** u
2e560 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20  se the "BINARY" 
2e570 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2e580 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
2e590 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  id havingToWhere
2e5a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2e5b0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
2e5c0 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
2e5d0 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
2e5e0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b   0, sizeof(sWalk
2e5f0 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  er));.  sWalker.
2e600 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2e610 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
2e620 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e  Callback = havin
2e630 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a  gToWhereExprCb;.
2e640 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c    sWalker.u.pSel
2e650 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  ect = p;.  sqlit
2e660 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
2e670 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  ker, p->pHaving)
2e680 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2e690 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2e6a0 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26  sWalker.eCode &&
2e6b0 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
2e6c0 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
2e6d0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2e6e0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2e6f0 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47  ,p,("Move HAVING
2e700 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52   terms into WHER
2e710 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  E:\n"));.    sql
2e720 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2e730 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2e740 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2e750 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2e760 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79   the pThis entry
2e770 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20   of pTabList is 
2e780 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61  a self-join of a
2e790 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20   prior view..** 
2e7a0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72  If it is, then r
2e7b0 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73  eturn the SrcLis
2e7c0 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70  t_item for the p
2e7d0 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69  rior view.  If i
2e7e0 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65  t is not,.** the
2e7f0 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  n return 0..*/.s
2e800 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63  tatic struct Src
2e810 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c  List_item *isSel
2e820 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63  fJoinView(.  Src
2e830 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2e840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2e850 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69  rch for self-joi
2e860 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20  ns in this FROM 
2e870 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2e880 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2e890 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72  *pThis   /* Sear
2e8a0 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66  ch for prior ref
2e8b0 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73  erence to this s
2e8c0 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
2e8d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2e8e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
2e8f0 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69  r(pItem = pTabLi
2e900 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68  st->a; pItem<pTh
2e910 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  is; pItem++){.  
2e920 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2e930 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
2e940 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
2e950 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2e960 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
2e970 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
2e980 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
2e990 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
2e9a0 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
2e9b0 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68  ->zDatabase, pTh
2e9c0 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d  is->zDatabase)!=
2e9d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2e9e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2e9f0 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
2ea00 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
2ea10 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2ea20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ea30 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a  ExprCompare(0, .
2ea40 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73 2d            pThis-
2ea50 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2ea60 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
2ea70 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20  ->pWhere, -1) . 
2ea80 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2ea90 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69  he view was modi
2eaa0 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68  fied by some oth
2eab0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
2eac0 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a  such as.      **
2ead0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2eae0 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63  rms() */.      c
2eaf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2eb00 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b     return pItem;
2eb10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2eb20 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2eb30 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2eb40 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
2eb50 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e   Attempt to tran
2eb60 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66  sform a query of
2eb70 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
2eb80 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2eb90 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
2eba0 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  x FROM t1 UNION 
2ebb0 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f  ALL SELECT y FRO
2ebc0 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f  M t2).**.** Into
2ebd0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2ebe0 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
2ebf0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29  ount(*) FROM t1)
2ec00 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  +(SELECT count(*
2ec10 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  ) FROM t2).**.**
2ec20 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   The transformat
2ec30 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  ion only works i
2ec40 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
2ec50 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2ec60 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
2ec70 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e  subquery is a UN
2ec80 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f  ION ALL of two o
2ec90 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20  r more terms.** 
2eca0 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f    *  There is no
2ecb0 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20   WHERE or GROUP 
2ecc0 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61  BY or HAVING cla
2ecd0 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71  uses on the subq
2ece0 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54  ueries.**   *  T
2ecf0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
2ed00 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74  s a simple count
2ed10 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (*).**.** Return
2ed20 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74   TRUE if the opt
2ed30 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64  imization is und
2ed40 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74  ertaken..*/.stat
2ed50 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69  ic int countOfVi
2ed60 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50  ewOptimization(P
2ed70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2ed80 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
2ed90 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f  ct *pSub, *pPrio
2eda0 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r;.  Expr *pExpr
2edb0 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74  ;.  Expr *pCount
2edc0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2edd0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
2ede0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2edf0 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  te)==0 ) return 
2ee00 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  0;   /* This is 
2ee10 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
2ee20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2ee30 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
2ee40 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2ee50 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65      /* Single re
2ee60 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
2ee70 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
2ee80 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
2ee90 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2eea0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2eeb0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2eec0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73      /* Result is
2eed0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2eee0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
2eef0 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  tricmp(pExpr->u.
2ef00 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20  zToken,"count") 
2ef10 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2ef20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  Is count() */.  
2ef30 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  if( pExpr->x.pLi
2ef40 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st!=0 ) return 0
2ef50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ef60 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75    /* Must be cou
2ef70 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70  nt(*) */.  if( p
2ef80 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
2ef90 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2efb0 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f  One table in FRO
2efc0 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  M  */.  pSub = p
2efd0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2efe0 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62  lect;.  if( pSub
2eff0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f020 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75   FROM is a subqu
2f030 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ery */.  if( pSu
2f040 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  b->pPrior==0 ) r
2f050 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2f060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
2f070 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  st be a compound
2f080 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20   ry */.  do{.   
2f090 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54   if( pSub->op!=T
2f0a0 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70  K_ALL && pSub->p
2f0b0 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
2f0c0 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e  ;  /* Must be UN
2f0d0 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69  ION ALL */.    i
2f0e0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
2f0f0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f110 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61   /* No WHERE cla
2f120 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  use */.    if( p
2f130 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
2f140 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72  SF_Aggregate ) r
2f150 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
2f160 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  Not an aggregate
2f170 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
2f180 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20  Sub->pPrior;    
2f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70            /* Rep
2f1b0 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e  eat over compoun
2f1c0 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70  d */.  }while( p
2f1d0 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Sub );..  /* If 
2f1e0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
2f1f0 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f  int then it is O
2f200 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  K to perform the
2f210 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2f220 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
2f230 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20  e->db;.  pCount 
2f240 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72  = pExpr;.  pExpr
2f250 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70   = 0;.  pSub = p
2f260 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2f270 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d  lect;.  p->pSrc-
2f280 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
2f290 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  0;.  sqlite3SrcL
2f2a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2f2b0 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72  >pSrc);.  p->pSr
2f2c0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
2f2d0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
2f2e0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70  db, sizeof(*p->p
2f2f0 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  Src));.  while( 
2f300 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72  pSub ){.    Expr
2f310 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72   *pTerm;.    pPr
2f320 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  ior = pSub->pPri
2f330 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50  or;.    pSub->pP
2f340 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53  rior = 0;.    pS
2f350 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ub->pNext = 0;. 
2f360 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67     pSub->selFlag
2f370 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2f380 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  e;.    pSub->sel
2f390 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
2f3a0 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d  pound;.    pSub-
2f3b0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2f3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2f3d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2f3e0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
2f3f0 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72    pTerm = pPrior
2f400 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   ? sqlite3ExprDu
2f410 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29  p(db, pCount, 0)
2f420 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70   : pCount;.    p
2f430 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sub->pEList = sq
2f440 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2f450 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70  end(pParse, 0, p
2f460 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
2f470 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2f480 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
2f490 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  T, 0, 0);.    sq
2f4a0 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
2f4b0 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65 72  ect(pParse, pTer
2f4c0 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66  m, pSub);.    if
2f4d0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
2f4e0 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
2f4f0 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  m;.    }else{.  
2f500 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2f510 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2f520 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c   TK_PLUS, pTerm,
2f530 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20   pExpr);.    }. 
2f540 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72     pSub = pPrior
2f550 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73  ;.  }.  p->pELis
2f560 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  t->a[0].pExpr = 
2f570 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46  pExpr;.  p->selF
2f580 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72  lags &= ~SF_Aggr
2f590 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45  egate;..#if SELE
2f5a0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2f5b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2f5c0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2f5d0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2f5e0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2f5f0 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74  ,p,("After count
2f600 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a  -of-view optimiz
2f610 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ation:\n"));.   
2f620 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2f630 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2f640 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2f650 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2f660 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54   /* SQLITE_COUNT
2f670 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2f680 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ION */../*.** Ge
2f690 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2f6a0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2f6b0 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
2f6c0 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
2f6d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
2f6e0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
2f6f0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2f700 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
2f710 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
2f720 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
2f730 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
2f740 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2f750 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f760 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2f770 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
2f780 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
2f790 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
2f7a0 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
2f7b0 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
2f7c0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
2f7d0 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
2f7e0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
2f7f0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
2f800 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
2f810 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2f820 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
2f830 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
2f840 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
2f850 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2f860 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
2f870 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2f880 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2f890 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2f8a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2f8b0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2f8c0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2f8d0 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
2f8e0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
2f8f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
2f900 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
2f910 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
2f920 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2f930 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2f940 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2f950 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2f960 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
2f970 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2f980 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
2f990 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2f9a0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2f9b0 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
2f9c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
2f9d0 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
2f9e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2f9f0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
2fa00 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
2fa10 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2fa20 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
2fa30 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
2fa40 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
2fa50 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2fa60 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
2fa70 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
2fa80 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
2fa90 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
2faa0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2fab0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2fac0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2fad0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
2fae0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
2faf0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
2fb00 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2fb10 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
2fb20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
2fb30 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2fb40 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
2fb50 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
2fb60 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2fb70 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
2fb80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
2fb90 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
2fba0 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
2fbb0 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
2fbc0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2fbd0 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
2fbe0 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
2fbf0 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
2fc00 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
2fc10 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
2fc20 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
2fc30 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2fc40 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
2fc50 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
2fc60 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
2fc70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2fc80 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
2fc90 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2fca0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2fcb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2fcc0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2fcd0 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
2fce0 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20  *pMinMaxOrderBy 
2fcf0 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f  = 0;  /* Added O
2fd00 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f  RDER BY for min/
2fd10 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  max queries */. 
2fd20 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20   u8 minMaxFlag; 
2fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd40 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f  /* Flag for min/
2fd50 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a  max queries */..
2fd60 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2fd70 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
2fd80 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
2fd90 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
2fda0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2fdb0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
2fdc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2fdd0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2fde0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2fdf0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
2fe00 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
2fe10 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
2fe20 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
2fe30 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
2fe40 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2fe50 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45  E_ENABLED.  SELE
2fe60 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
2fe70 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63  ,p, ("begin proc
2fe80 65 73 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61 72  essing:\n", pPar
2fe90 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29  se->addrExplain)
2fea0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2feb0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2fec0 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  100 ){.    sqlit
2fed0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2fee0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2fef0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2ff00 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2ff10 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2ff20 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b  =SRT_DistFifo );
2ff30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2ff40 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2ff50 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46  st->eDest!=SRT_F
2ff60 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2ff70 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2ff80 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2ff90 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
2ffa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2ffb0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2ffc0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2ffd0 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49  Queue );.  if( I
2ffe0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2fff0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
30000 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
30010 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
30020 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
30030 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
30040 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
30050 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
30060 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
30070 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c  ==SRT_Discard ||
30080 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
30090 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75  t->eDest==SRT_Qu
300a0 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65  eue  || pDest->e
300b0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
300c0 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  fo ||.          
300d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
300e0 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20  RT_DistQueue || 
300f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
30100 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20  T_Fifo);.    /* 
30110 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
30120 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
30130 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
30140 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
30150 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
30160 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
30170 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
30180 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
30190 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
301a0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
301b0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
301c0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
301d0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
301e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
301f0 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
30200 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  , 0);.  memset(&
30210 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sSort, 0, sizeof
30220 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72  (sSort));.  sSor
30230 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
30240 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
30250 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
30260 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
30270 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
30280 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61  ect_end;.  }.  a
30290 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
302a0 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d  !=0 );.  isAgg =
302b0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
302c0 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
302d0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
302e0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
302f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
30300 63 65 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20  ce & 0x104 ){.  
30310 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
30320 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  104,pParse,p, ("
30330 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
30340 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
30350 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
30360 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
30370 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
30380 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
30390 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
303a0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
303b0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
303c0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 72  );.  }..  if( (r
303d0 63 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  c = sqlite3Windo
303e0 77 52 65 77 72 69 74 65 28 70 50 61 72 73 65 2c  wRewrite(pParse,
303f0 20 70 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   p)) ){.    goto
30400 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
30410 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
30420 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
30430 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
30440 65 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20 20  e & 0x108 ){.   
30450 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
30460 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  04,pParse,p, ("a
30470 66 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77 72  fter window rewr
30480 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ite:\n"));.    s
30490 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
304a0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
304b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 54 61 62   }.#endif.  pTab
304c0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
304d0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76 61 72  .  /* Try to var
304e0 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
304f0 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67 20 73  ns (flattening s
30500 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64 20 73  ubqueries, and s
30510 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72 65 64  trength.  ** red
30520 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20 6f  uction of join o
30530 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74 68 65  perators) in the
30540 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20   FROM clause up 
30550 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75  into the main qu
30560 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ery.  */.#if !de
30570 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
30580 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
30590 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
305a0 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
305b0 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20  i=0; !p->pPrior 
305c0 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  && i<pTabList->n
305d0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
305e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
305f0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
30600 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  bList->a[i];.   
30610 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
30620 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
30630 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
30640 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a  = pItem->pTab;..
30650 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4c      /* Convert L
30660 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a 4f  EFT JOIN into JO
30670 49 4e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  IN if there are 
30680 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72 69 67  terms of the rig
30690 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  ht table.    ** 
306a0 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  of the LEFT JOIN
306b0 20 75 73 65 64 20 69 6e 20 74 68 65 20 57 48 45   used in the WHE
306c0 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  RE clause..    *
306d0 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65 6d  /.    if( (pItem
306e0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
306f0 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20  JT_LEFT)!=0.    
30700 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
30710 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77  mpliesNonNullRow
30720 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65  (p->pWhere, pIte
30730 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20  m->iCursor).    
30740 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
30750 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
30760 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69 6e 29  TE_SimplifyJoin)
30770 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 45  .    ){.      SE
30780 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
30790 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20  pParse,p,.      
307a0 20 20 20 20 20 20 20 20 20 20 28 22 4c 45 46 54            ("LEFT
307b0 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69 65 73  -JOIN simplifies
307c0 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65 72 6d   to JOIN on term
307d0 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20 20 20   %d\n",i));.    
307e0 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e    pItem->fg.join
307f0 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c 45 46  type &= ~(JT_LEF
30800 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20 20 20  T|JT_OUTER);.   
30810 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
30820 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65  (p->pWhere, pIte
30830 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
30840 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 66 75   }..    /* No fu
30850 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66 20 74  ther action if t
30860 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68 65 20  his term of the 
30870 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e  FROM clause is n
30880 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  o a subquery */.
30890 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
308a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
308b0 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74   /* Catch mismat
308c0 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72  ch in the declar
308d0 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20  ed columns of a 
308e0 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d  view and the num
308f0 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f  ber of.    ** co
30900 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  lumns in the SEL
30910 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a  ECT on the RHS *
30920 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
30930 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69  nCol!=pSub->pELi
30940 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
30950 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
30960 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65  sg(pParse, "expe
30970 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
30980 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74  for '%s' but got
30990 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
309a0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
309b0 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e  ->nCol, pTab->zN
309c0 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ame, pSub->pELis
309d0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
309e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
309f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
30a00 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c  Do not try to fl
30a10 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65 67 61  atten an aggrega
30a20 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  te subquery..   
30a30 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74   **.    ** Flatt
30a40 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ening an aggrega
30a50 74 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6f  te subquery is o
30a60 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
30a70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
30a80 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20      ** is not a 
30a90 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68  join.  But if th
30aa0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
30ab0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65   not a join, the
30ac0 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  n the subquery. 
30ad0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d     ** will be im
30ae0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
30af0 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20 74 68  o-routine and th
30b00 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74  ere is no advant
30b10 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c  age to.    ** fl
30b20 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68 61 74  attening in that
30b30 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
30b40 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73 65 6c    if( (pSub->sel
30b50 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
30b60 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  gate)!=0 ) conti
30b70 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
30b80 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d   pSub->pGroupBy=
30b90 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  =0 );..    /* If
30ba0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
30bb0 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f 6d   contains a "com
30bc0 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73 65 74  plex" result set
30bd0 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20 20 2a   (that is,.    *
30be0 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  * if the result 
30bf0 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
30c00 20 71 75 65 72 79 20 75 73 65 73 20 66 75 6e 63   query uses func
30c10 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75 65 72  tions or subquer
30c20 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ies).    ** and 
30c30 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
30c40 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52 44 45  contains an ORDE
30c50 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
30c60 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 6c  if.    ** it wil
30c70 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l be implemented
30c80 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
30c90 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
30ca0 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20 20 20  atten.  This.   
30cb0 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   ** restriction 
30cc0 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e 73 74  allows SQL const
30cd0 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69 73 3a  ructs like this:
30ce0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
30cf0 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69 76 65  SELECT expensive
30d00 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20 20 20  _function(x).   
30d10 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53 45 4c   **    FROM (SEL
30d20 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20 4f  ECT x FROM tab O
30d30 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54 20  RDER BY y LIMIT 
30d40 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  10);.    **.    
30d50 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69 76 65  ** The expensive
30d60 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 6f  _function() is o
30d70 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f 6e 20  nly computed on 
30d80 74 68 65 20 31 30 20 72 6f 77 73 20 74 68 61 74  the 10 rows that
30d90 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75 74 70  .    ** are outp
30da0 75 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  ut, rather than 
30db0 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74 68 65  every row of the
30dc0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
30dd0 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75 69 72     ** The requir
30de0 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 6f  ement that the o
30df0 75 74 65 72 20 71 75 65 72 79 20 68 61 76 65 20  uter query have 
30e00 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75 6c 74  a complex result
30e10 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e   set.    ** mean
30e20 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
30e30 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f 6e 20  g does occur on 
30e40 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f 6e 73  simpler SQL cons
30e50 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75 74 0a  traints without.
30e60 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 6e      ** the expen
30e70 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  sive_function() 
30e80 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  like:.    **.   
30e90 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20 46 52   **  SELECT x FR
30ea0 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
30eb0 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79  M tab ORDER BY y
30ec0 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20   LIMIT 10);.    
30ed0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
30ee0 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20 20 20  >pOrderBy!=0.   
30ef0 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20 20 26    && i==0.     &
30f00 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
30f10 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c   SF_ComplexResul
30f20 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  t)!=0.     && (p
30f30 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
30f40 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54  .         || (pT
30f50 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e  abList->a[1].fg.
30f60 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46  jointype&(JT_LEF
30f70 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
30f80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
30f90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
30fa0 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
30fb0 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
30fc0 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b 0a 20  , i, isAgg) ){. 
30fd0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
30fe0 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
30ff0 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
31000 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
31010 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  i = -1;.    }.  
31020 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
31030 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62  pSrc;.    if( db
31040 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
31050 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
31060 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
31070 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
31080 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
31090 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
310a0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
310b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
310c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
310d0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
310e0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
310f0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
31100 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
31110 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
31120 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
31130 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
31140 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
31150 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
31160 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
31170 70 44 65 73 74 29 3b 0a 23 69 66 20 53 45 4c 45  pDest);.#if SELE
31180 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
31190 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
311a0 30 78 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  0x1,pParse,p,("e
311b0 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
311c0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
311d0 29 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c  ));.    if( (sql
311e0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
311f0 26 20 30 78 32 30 30 30 29 21 3d 30 20 26 26 20  & 0x2000)!=0 && 
31200 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
31210 50 61 72 65 6e 74 28 70 50 61 72 73 65 29 3d 3d  Parent(pParse)==
31220 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
31230 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
31240 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  (0, p, 0);.    }
31250 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
31260 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 20 45 78  p->pNext==0 ) Ex
31270 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
31280 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  p(pParse);.    r
31290 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
312a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  ndif..  /* For e
312b0 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ach term in the 
312c0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20  FROM clause, do 
312d0 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a  two things:.  **
312e0 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20   (1) Authorized 
312f0 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  unreferenced tab
31300 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e  les.  ** (2) Gen
31310 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
31320 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20  ll sub-queries. 
31330 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
31340 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
31350 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
31360 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
31370 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
31380 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
31390 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
313a0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a    Select *pSub;.
313b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
313c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
313d0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
313e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
313f0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
31400 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
31410 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  xt;.#endif..    
31420 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f  /* Issue SQLITE_
31430 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69  READ authorizati
31440 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65 20  ons with a fake 
31450 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20  column name for 
31460 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  any.    ** table
31470 73 20 74 68 61 74 20 61 72 65 20 72 65 66 65 72  s that are refer
31480 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77  enced but from w
31490 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61  hich no values a
314a0 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20  re extracted..  
314b0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66    ** Examples of
314c0 20 77 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e   where these kin
314d0 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54  ds of null SQLIT
314e0 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
314f0 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75  tions.    ** wou
31500 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a  ld occur:.    **
31510 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
31520 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
31530 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45   t1;   -- SQLITE
31540 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20  _READ t1."".    
31550 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74 31  **     SELECT t1
31560 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20  .* FROM t1, t2; 
31570 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44    -- SQLITE_READ
31580 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20   t2."".    **.  
31590 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f    ** The fake co
315a0 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20  lumn name is an 
315b0 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49  empty string.  I
315c0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
315d0 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20  r a table to.   
315e0 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d   ** have a colum
315f0 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65  n named by the e
31600 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20  mpty string, in 
31610 77 68 69 63 68 20 63 61 73 65 20 74 68 65 72 65  which case there
31620 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20   is no way to.  
31630 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68    ** distinguish
31640 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65   between an unre
31650 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61  ferenced table a
31660 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66  nd an actual ref
31670 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20  erence to the.  
31680 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20    ** "" column. 
31690 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
316a0 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20  ign was for the 
316b0 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
316c0 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20   to be a NULL,. 
316d0 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c     ** which woul
316e0 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73  d be unambiguous
316f0 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20 61 75  .  But legacy au
31700 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
31710 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20  backs might.    
31720 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f  ** assume the co
31730 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e  lumn name is non
31740 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75  -NULL and segfau
31750 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  lt.  The use of 
31760 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20  an empty.    ** 
31770 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66  string for the f
31780 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
31790 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20  seems safer..   
317a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
317b0 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b  m->colUsed==0 ){
317c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
317d0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
317e0 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74  SQLITE_READ, pIt
317f0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70  em->zName, "", p
31800 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
31810 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
31820 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
31830 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
31840 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
31850 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a  MIT_VIEW).    /*
31860 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
31870 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
31880 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
31890 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20  lause.    */.   
318a0 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pSub = pItem->p
318b0 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
318c0 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pSub==0 ) contin
318d0 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65  ue;..    /* Some
318e0 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66  times the code f
318f0 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69  or a subquery wi
31900 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
31910 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  more than.    **
31920 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75   once, if the su
31930 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f  bquery is part o
31940 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
31950 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49  se in a LEFT JOI
31960 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78  N,.    ** for ex
31970 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  ample.  In that 
31980 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67  case, do not reg
31990 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
319a0 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20   to manifest.   
319b0 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68   ** a view or th
319c0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20  e co-routine to 
319d0 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77  implement a view
319e0 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73  .  The first ins
319f0 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20  tance.    ** is 
31a00 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75  sufficient, thou
31a10 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  gh the subroutin
31a20 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68  e to manifest th
31a30 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64  e view does need
31a40 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
31a50 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a  voked again. */.
31a60 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61      if( pItem->a
31a70 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20  ddrFillSub ){.  
31a80 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
31a90 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d  g.viaCoroutine==
31aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
31ab0 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  The subroutine t
31ac0 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68  hat manifests th
31ad0 65 20 76 69 65 77 20 6d 69 67 68 74 20 62 65 20  e view might be 
31ae0 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69  a one-time routi
31af0 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ne,.        ** o
31b00 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20  r it might need 
31b10 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65  to be rerun on e
31b20 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65  ach iteration be
31b30 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 20  cause it.       
31b40 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f   ** encodes a co
31b50 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
31b60 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65  y. */.        te
31b70 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 56  stcase( sqlite3V
31b80 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65  dbeGetOp(v, pIte
31b90 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d  m->addrFillSub)-
31ba0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65  >opcode==OP_Once
31bb0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
31bc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
31bd0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
31be0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
31bf0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
31c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31c10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
31c20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
31c30 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
31c40 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
31c50 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
31c60 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
31c70 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
31c80 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
31c90 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
31ca0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
31cb0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
31cc0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
31cd0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
31ce0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
31cf0 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
31d00 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
31d10 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
31d20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
31d30 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
31d40 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
31d50 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
31d60 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
31d70 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
31d80 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
31d90 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
31da0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
31db0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
31dc0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
31dd0 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
31de0 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
31df0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
31e00 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
31e10 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
31e20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
31e30 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
31e40 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
31e50 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
31e60 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
31e70 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
31e80 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20 20 20  E_PushDown).    
31e90 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72   && pushDownWher
31ea0 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  eTerms(pParse, p
31eb0 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  Sub, p->pWhere, 
31ec0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a  pItem->iCursor,.
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ee0 20 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65             (pIte
31ef0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
31f00 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a 20   JT_OUTER)!=0). 
31f10 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54     ){.#if SELECT
31f20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31f30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
31f40 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
31f50 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45  00 ){.        SE
31f60 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
31f70 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
31f80 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75   WHERE-clause pu
31f90 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20  sh-down:\n"));. 
31fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
31fb0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
31fc0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  p, 0);.      }.#
31fd0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
31fe0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
31ff0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
32000 70 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f  p,("Push-down no
32010 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b  t possible\n"));
32020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76  .    }..    zSav
32030 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
32040 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
32050 74 65 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65  text;.    pParse
32060 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
32070 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a   pItem->zName;..
32080 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
32090 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
320a0 74 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  t the subquery. 
320b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
320c0 20 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70   subquery is imp
320d0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
320e0 2d 72 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20  -routine if the 
320f0 73 75 62 71 75 65 72 79 20 69 73 0a 20 20 20 20  subquery is.    
32100 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
32110 20 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   be the outer lo
32120 6f 70 20 28 73 6f 20 74 68 61 74 20 69 74 20 64  op (so that it d
32130 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
32140 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74  be.    ** comput
32150 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
32160 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e).    **.    **
32170 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65   TODO: Are there
32180 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62   other reasons b
32190 65 73 69 64 65 20 28 31 29 20 74 6f 20 75 73 65  eside (1) to use
321a0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20   a co-routine.  
321b0 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74    ** implementat
321c0 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion?.    */.    
321d0 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26  if( i==0.     &&
321e0 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
321f0 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==1.            
32200 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
32210 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
32220 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
32230 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a  ))!=0)  /* (1) *
32240 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  /.    ){.      /
32250 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
32260 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
32270 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
32280 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
32290 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
322a0 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
322b0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
322c0 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
322d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
322e0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a  rrentAddr(v)+1;.
322f0 20 20 20 20 20 0a 20 20 20 20 20 20 70 49 74 65       .      pIte
32300 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
32310 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
32320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32330 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
32340 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  tCoroutine, pIte
32350 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c  m->regReturn, 0,
32360 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
32370 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
32380 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54   "%s", pItem->pT
32390 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
323a0 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
323b0 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b  llSub = addrTop;
323c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
323d0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
323e0 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
323f0 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
32400 75 72 6e 29 3b 0a 20 20 20 20 20 20 45 78 70 6c  urn);.      Expl
32410 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
32420 61 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55  arse, 1, "CO-ROU
32430 54 49 4e 45 20 30 78 25 70 22 2c 20 70 53 75 62  TINE 0x%p", pSub
32440 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
32450 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
32460 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
32470 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
32480 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
32490 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
324a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
324b0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
324c0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
324d0 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
324e0 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
324f0 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
32500 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72  tine(v, pItem->r
32510 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
32520 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
32530 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
32540 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
32550 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
32560 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
32570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
32580 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
32590 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
325a0 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
325b0 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
325c0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
325d0 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
325e0 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
325f0 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
32600 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
32610 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
32620 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
32630 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
32640 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
32650 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
32660 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
32670 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
32680 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
32690 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
326a0 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
326b0 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
326c0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
326d0 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74  etAddr;.      st
326e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
326f0 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20  m *pPrior;..    
32700 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
32710 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20  >addrFillSub==0 
32720 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
32730 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
32740 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
32750 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69    topAddr = sqli
32760 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
32770 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
32780 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
32790 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
327a0 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f  addrFillSub = to
327b0 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69  pAddr+1;.      i
327c0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43  f( pItem->fg.isC
327d0 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
327e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
327f0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
32800 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
32810 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
32820 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
32830 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
32840 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
32850 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
32860 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
32870 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
32880 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
32890 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
328a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
328b0 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
328c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
328d0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
328e0 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
328f0 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
32900 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
32910 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32920 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
32930 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
32940 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
32950 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
32960 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
32970 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53      pPrior = isS
32980 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62  elfJoinView(pTab
32990 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20  List, pItem);.  
329a0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
329b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
329c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
329d0 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d  P_OpenDup, pItem
329e0 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f  ->iCursor, pPrio
329f0 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  r->iCursor);.   
32a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
32a10 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ior->pSelect!=0 
32a20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  );.        pSub-
32a30 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
32a40 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e  rior->pSelect->n
32a50 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
32a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32a70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
32a80 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
32a90 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
32aa0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
32ab0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
32ac0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
32ad0 20 22 4d 41 54 45 52 49 41 4c 49 5a 45 20 30 78   "MATERIALIZE 0x
32ae0 25 70 22 2c 20 70 53 75 62 29 29 3b 0a 20 20 20  %p", pSub));.   
32af0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
32b00 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
32b10 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   &dest);.      }
32b20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
32b30 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
32b40 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
32b50 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
32b60 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
32b70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
32b80 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
32b90 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
32ba0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
32bb0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
32bc0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
32bd0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
32be0 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
32bf0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
32c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32c10 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
32c20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
32c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32c40 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
32c50 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
32c60 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
32c70 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
32c80 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
32c90 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
32ca0 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
32cb0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
32cc0 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
32cd0 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
32ce0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
32cf0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56  ndif.  }..  /* V
32d00 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20  arious elements 
32d10 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  of the SELECT co
32d20 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  pied into local 
32d30 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20  variables for.  
32d40 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a  ** convenience *
32d50 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
32d60 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65  pEList;.  pWhere
32d70 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
32d80 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
32d90 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
32da0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
32db0 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
32dc0 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
32dd0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
32de0 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  !=0;..#if SELECT
32df0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
32e00 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
32e10 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
32e20 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
32e30 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
32e40 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f  ,("After all FRO
32e50 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69  M-clause analysi
32e60 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  s:\n"));.    sql
32e70 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
32e80 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
32e90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
32ea0 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49  SQLITE_COUNTOFVI
32eb0 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EW_OPTIMIZATION.
32ec0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
32ed0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
32ee0 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
32ef0 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74  ner|SQLITE_Count
32f00 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20 63 6f  OfView).   && co
32f10 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a  untOfViewOptimiz
32f20 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 29  ation(pParse, p)
32f30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  .  ){.    if( db
32f40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
32f50 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
32f60 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
32f70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 54  ->pEList;.    pT
32f80 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
32f90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
32fa0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
32fb0 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
32fc0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
32fd0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
32fe0 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
32ff0 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
33000 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
33010 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
33020 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
33030 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
33040 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
33050 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
33060 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
33070 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
33080 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
33090 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
330a0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
330b0 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
330c0 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
330d0 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
330e0 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
330f0 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a  xyz ORDER BY xyz
33100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
33110 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72  econd form is pr
33120 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e  eferred as a sin
33130 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65  gle index (or te
33140 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65  mp-table) may be
33150 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20   .  ** used for 
33160 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  both the ORDER B
33170 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70  Y and DISTINCT p
33180 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72  rocessing. As or
33190 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77  iginally .  ** w
331a0 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79  ritten the query
331b0 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70   must use a temp
331c0 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65  -table for at le
331d0 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f  ast one of the O
331e0 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e  RDER .  ** BY an
331f0 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20  d DISTINCT, and 
33200 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61  an index or sepa
33210 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20  rate temp-table 
33220 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  for the other.. 
33230 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
33240 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
33250 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
33260 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
33270 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t .   && sqlite3
33280 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
33290 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
332a0 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20  pEList, -1)==0. 
332b0 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
332c0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
332d0 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42  nct;.    pGroupB
332e0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  y = p->pGroupBy 
332f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
33300 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
33310 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69   0);.    /* Noti
33320 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  ce that even tho
33330 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74  ught SF_Distinct
33340 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
33350 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61  d from p->selFla
33360 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  gs,.    ** the s
33370 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
33380 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48  is still set.  H
33390 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70  ence, isTnct rep
333a0 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20  resents the.    
333b0 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74  ** original sett
333c0 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69  ing of the SF_Di
333d0 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74  stinct flag, not
333e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
333f0 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65  ting */.    asse
33400 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  rt( sDistinct.is
33410 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c  Tnct );..#if SEL
33420 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
33430 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
33440 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
33450 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c  400 ){.      SEL
33460 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
33470 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66  Parse,p,("Transf
33480 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74  orm DISTINCT int
33490 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29  o GROUP BY:\n"))
334a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
334b0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
334c0 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   p, 0);.    }.#e
334d0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ndif.  }..  /* I
334e0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
334f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
33500 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70  hen create an ep
33510 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
33520 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72  .  ** do the sor
33530 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20  ting.  But this 
33540 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61  sorting ephemera
33550 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  l index might en
33560 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20  d up.  ** being 
33570 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
33580 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63  ta can be extrac
33590 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
335a0 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66  d order..  ** If
335b0 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
335c0 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f  e, then the OP_O
335d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
335e0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
335f0 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  .  ** changed to
33600 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
33610 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
33620 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
33630 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f  index is.  ** no
33640 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73  t needed.  The s
33650 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
33660 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ex variable is u
33670 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
33680 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e  e.  ** that chan
33690 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ge..  */.  if( s
336a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
336b0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
336c0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
336d0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
336e0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
336f0 74 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  t(.        pPars
33700 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
33710 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  y, 0, pEList->nE
33720 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  xpr);.    sSort.
33730 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
33740 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
33750 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
33760 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
33770 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
33780 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
33790 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72  ,.          sSor
337a0 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72  t.iECursor, sSor
337b0 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
337c0 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r+1+pEList->nExp
337d0 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
337e0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
337f0 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20   P4_KEYINFO.    
33800 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
33810 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
33820 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
33830 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
33840 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
33850 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
33860 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
33870 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
33880 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
33890 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
338a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
338b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
338c0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
338d0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69  t->iSDParm, pELi
338e0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
338f0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
33900 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
33910 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
33920 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
33930 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
33940 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
33950 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  )==0 ){.    p->n
33960 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b  SelectRow = 320;
33970 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72    /* 4 billion r
33980 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d  ows */.  }.  com
33990 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
339a0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
339b0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
339c0 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74  imit==0 && sSort
339d0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
339e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
339f0 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
33a00 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
33a10 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74  rtIndex, OP_Sort
33a20 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f  erOpen);.    sSo
33a30 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20  rt.sortFlags |= 
33a40 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
33a50 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
33a60 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
33a70 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
33a80 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
33a90 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
33aa0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
33ab0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
33ac0 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
33ad0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
33ae0 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
33af0 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
33b00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
33b10 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
33b20 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
33b30 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
33b40 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
33b50 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
33b60 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
33b70 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46  )sqlite3KeyInfoF
33b80 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
33b90 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
33ba0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
33bb0 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
33bc0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
33bd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
33be0 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
33bf0 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
33c00 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
33c10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
33c20 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
33c30 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
33c40 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
33c50 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
33c60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
33c70 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
33c80 30 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20  0 ){.    Window 
33c90 2a 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  *pWin = p->pWin;
33ca0 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20        /* Master 
33cb0 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f  window object (o
33cc0 72 20 4e 55 4c 4c 29 20 2a 2f 0a 0a 20 20 20 20  r NULL) */..    
33cd0 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
33ce0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
33cf0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
33d00 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
33d10 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
33d20 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
33d30 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
33d40 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
33d50 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  t( WHERE_USE_LIM
33d60 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69  IT==SF_FixedLimi
33d70 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c  t );.    wctrlFl
33d80 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61  ags |= p->selFla
33d90 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
33da0 69 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 69  it;..    if( pWi
33db0 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
33dc0 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74  e3WindowCodeInit
33dd0 28 70 50 61 72 73 65 2c 20 70 57 69 6e 29 3b 0a  (pParse, pWin);.
33de0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65      }..    /* Be
33df0 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
33e00 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45   scan. */.    SE
33e10 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
33e20 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69  se,p,("WhereBegi
33e30 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49 6e  n\n"));.    pWIn
33e40 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
33e50 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
33e60 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
33e70 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
33e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ea0 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c  p->pEList, wctrl
33eb0 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63  Flags, p->nSelec
33ec0 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  tRow);.    if( p
33ed0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
33ee0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
33ef0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
33f00 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
33f10 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
33f20 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
33f30 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
33f40 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
33f50 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
33f60 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
33f70 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
33f80 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
33f90 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
33fa0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
33fb0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
33fc0 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
33fd0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
33fe0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
33ff0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
34000 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
34010 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
34020 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
34030 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53  WInfo);.      sS
34040 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65  ort.bOrderedInne
34050 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57  rLoop = sqlite3W
34060 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72  hereOrderedInner
34070 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Loop(pWInfo);.  
34080 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
34090 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
340a0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
340b0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
340c0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
340d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
340e0 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
340f0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
34100 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
34110 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
34120 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
34130 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
34140 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
34150 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
34160 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
34170 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
34180 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
34190 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
341a0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
341b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
341c0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
341d0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
341e0 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
341f0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
34200 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
34210 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74  ->pEList==pEList
34220 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e   );.    if( pWin
34230 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
34240 64 72 47 6f 73 75 62 20 3d 20 73 71 6c 69 74 65  drGosub = sqlite
34250 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
34260 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  );.      int reg
34270 47 6f 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65  Gosub = ++pParse
34280 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  ->nMem;.      in
34290 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
342a0 20 20 69 6e 74 20 62 4c 6f 6f 70 20 3d 20 30 3b    int bLoop = 0;
342b0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ..      sqlite3W
342c0 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50  indowCodeStep(pP
342d0 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
342e0 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
342f0 6f 73 75 62 2c 20 26 62 4c 6f 6f 70 29 3b 0a 0a  osub, &bLoop);..
34300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34310 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
34320 74 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  to);.      sqlit
34330 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
34340 65 6c 28 76 2c 20 61 64 64 72 47 6f 73 75 62 29  el(v, addrGosub)
34350 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4c 6f 6f  ;.      if( bLoo
34360 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  p ){.        add
34370 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34380 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
34390 6e 64 2c 20 70 57 69 6e 2d 3e 69 45 70 68 43 73  nd, pWin->iEphCs
343a0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
343b0 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
343c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
343d0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
343e0 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49   }.      selectI
343f0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
34400 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
34410 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
34420 74 2c 20 61 64 64 72 2b 31 2c 20 30 29 3b 0a 20  t, addr+1, 0);. 
34430 20 20 20 20 20 69 66 28 20 62 4c 6f 6f 70 20 29       if( bLoop )
34440 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34450 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34460 50 5f 4e 65 78 74 2c 20 70 57 69 6e 2d 3e 69 45  P_Next, pWin->iE
34470 70 68 43 73 72 2c 20 61 64 64 72 2b 31 29 3b 0a  phCsr, addr+1);.
34480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34490 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
344a0 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
344b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
344c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
344d0 72 6e 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a 20  rn, regGosub);. 
344e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
344f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
34500 2d 31 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 50  -1);       /* OP
34510 5f 47 6f 74 6f 20 6a 75 6d 70 73 20 68 65 72 65  _Goto jumps here
34520 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   */..    }else{.
34530 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
34540 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
34550 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73  loop. */.      s
34560 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
34570 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
34580 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
34590 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
345a0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
345b0 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
345c0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
345d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
345e0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
345f0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74  ..      /* End t
34600 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
34610 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
34620 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
34630 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
34640 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
34650 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
34660 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
34670 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
34680 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
34690 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
346a0 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
346b0 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
346c0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
346d0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
346e0 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
346f0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
34700 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
34710 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
34720 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
34730 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
34740 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
34750 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
34760 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
34770 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
34780 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
34790 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
347a0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
347b0 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
347c0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
347d0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
347e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347f0 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
34800 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
34810 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
34820 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
34840 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
34850 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
34860 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
34870 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
34880 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
34890 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
348a0 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
348b0 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
348c0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
348d0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
348e0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
348f0 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
34900 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
34910 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
34920 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
34930 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
34940 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
34950 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
34960 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
34970 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
34980 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
34990 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
349a0 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
349b0 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
349c0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
349d0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
349e0 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
349f0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
34a00 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
34a10 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
34a20 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
34a30 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
34a40 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
34a50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34a60 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
34a70 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
34a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a90 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
34aa0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
34ab0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
34ac0 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
34ad0 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
34ae0 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
34af0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
34b00 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
34b10 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
34b20 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
34b30 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
34b40 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
34b50 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
34b60 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
34b70 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
34b80 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
34b90 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
34ba0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
34bb0 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
34bc0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
34bd0 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71    assert( 66==sq
34be0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
34bf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
34c00 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29  >nSelectRow>66 )
34c10 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
34c20 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   66;.    }else{.
34c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
34c40 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
34c50 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ) );.      p->nS
34c60 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
34c70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
34c80 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
34c90 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
34ca0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
34cb0 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
34cc0 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
34cd0 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
34ce0 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
34cf0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
34d00 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
34d10 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
34d20 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
34d30 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
34d40 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
34d50 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
34d60 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
34d70 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
34d80 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
34d90 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
34da0 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
34db0 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
34dc0 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
34dd0 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
34de0 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
34df0 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
34e00 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
34e10 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
34e20 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
34e30 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
34e40 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
34e50 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
34e60 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
34e70 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
34e80 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
34e90 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
34ea0 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
34eb0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
34ec0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
34ed0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
34ee0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
34ef0 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
34f00 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
34f10 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
34f20 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
34f30 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
34f40 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
34f50 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
34f60 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
34f70 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
34f80 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
34f90 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
34fa0 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
34fb0 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
34fc0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
34fd0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
34fe0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
34ff0 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
35000 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
35010 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
35020 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
35030 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
35040 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
35050 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e  List;.    sNC.uN
35060 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
35070 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f  ggInfo;.    VVA_
35080 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67  ONLY( sNC.ncFlag
35090 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b  s = NC_UAggInfo;
350a0 20 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   ).    sAggInfo.
350b0 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
350c0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
350d0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
350e0 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
350f0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
35100 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
35110 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
35120 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
35130 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
35140 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
35150 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
35160 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
35170 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
35180 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
35190 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
351a0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
351b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
351c0 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57  t( pWhere==p->pW
351d0 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20  here );.        
351e0 61 73 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d  assert( pHaving=
351f0 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20  =p->pHaving );. 
35200 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
35210 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f  GroupBy==p->pGro
35220 75 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  upBy );.        
35230 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50  havingToWhere(pP
35240 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
35250 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
35260 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  here;.      }.  
35270 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
35280 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
35290 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
352a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
352b0 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
352c0 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
352d0 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  umn;.    if( p->
352e0 70 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70  pGroupBy==0 && p
352f0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20  ->pHaving==0 && 
35300 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d  sAggInfo.nFunc==
35310 31 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61  1 ){.      minMa
35320 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75  xFlag = minMaxQu
35330 65 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ery(db, sAggInfo
35340 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c  .aFunc[0].pExpr,
35350 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   &pMinMaxOrderBy
35360 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35370 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d      minMaxFlag =
35380 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
35390 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  ORMAL;.    }.   
353a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
353b0 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
353c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
353d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
353e0 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b  (sAggInfo.aFunc[
353f0 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  i].pExpr, EP_xIs
35400 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
35410 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
35420 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
35430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
35440 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
35450 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
35460 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
35470 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43  List);.      sNC
35480 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
35490 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
354a0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
354b0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
354c0 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
354d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
354e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
354f0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
35500 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
35510 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
35520 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
35530 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
35540 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
35550 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
35560 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20 61  fter aggregate a
35570 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
35580 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
35590 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
355a0 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
355b0 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
355c0 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  .nColumn; ii++){
355d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
355e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67  DebugPrintf("agg
355f0 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d  -column[%d] iMem
35600 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
35610 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
35620 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b  .aCol[ii].iMem);
35630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35640 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
35650 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69  sAggInfo.aCol[ii
35660 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
35670 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
35680 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
35690 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  .nFunc; ii++){. 
356a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
356b0 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66  bugPrintf("agg-f
356c0 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64  unc[%d]: iMem=%d
356d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
356e0 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46   ii, sAggInfo.aF
356f0 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  unc[ii].iMem);. 
35700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
35710 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
35720 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
35730 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
35740 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
35750 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ...    /* Proces
35760 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
35770 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
35780 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
35790 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
357a0 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
357b0 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
357c0 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
357d0 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
357e0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
357f0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
35800 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
35810 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
35820 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
35830 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
35840 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
35850 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
35860 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
35870 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
35880 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
35890 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
358a0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
358b0 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
358c0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
358d0 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
358e0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
358f0 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
35900 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
35910 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
35920 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
35930 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
35940 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
35950 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
35960 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
35970 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
35980 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
35990 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
359a0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
359b0 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
359c0 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
359d0 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
359e0 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
359f0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
35a00 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
35a10 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
35a20 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
35a30 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
35a40 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
35a50 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
35a60 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
35a70 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
35a80 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
35a90 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
35aa0 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
35ab0 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
35ac0 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
35ad0 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
35ae0 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
35af0 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
35b00 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
35b10 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
35b20 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
35b30 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
35b40 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
35b50 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
35b60 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
35b70 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
35b80 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
35b90 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
35ba0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
35bb0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
35bc0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
35bd0 65 2c 70 47 72 6f 75 70 42 79 2c 30 2c 73 41 67  e,pGroupBy,0,sAg
35be0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a  gInfo.nColumn);.
35bf0 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
35c00 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
35c10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
35c20 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
35c30 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
35c40 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
35c50 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
35c60 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
35c70 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
35c80 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
35c90 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
35ca0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
35cb0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
35cc0 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
35cd0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
35ce0 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
35cf0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
35d00 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
35d10 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
35d20 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
35d30 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
35d40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
35d50 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
35d60 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
35d70 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
35d80 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
35d90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
35da0 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
35db0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
35dc0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
35dd0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
35de0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
35df0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
35e00 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
35e10 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
35e20 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
35e30 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
35e40 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
35e50 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
35e60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
35e70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
35e80 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
35e90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
35ea0 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
35eb0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
35ec0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35ed0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
35ee0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
35ef0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
35f00 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
35f10 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
35f20 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
35f30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
35f40 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
35f50 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
35f60 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
35f70 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
35f80 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
35f90 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
35fa0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
35fb0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
35fc0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
35fd0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
35fe0 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
35ff0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
36000 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
36010 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
36020 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
36030 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
36040 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
36050 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
36060 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
36070 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
36080 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
36090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
360a0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
360b0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
360c0 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  );.      SELECTT
360d0 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
360e0 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29  ("WhereBegin\n")
360f0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
36100 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
36110 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
36120 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
36130 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
36140 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
36150 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
36160 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
36170 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
36180 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
36190 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
361a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
361b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
361c0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
361d0 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
361e0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
361f0 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
36200 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
36210 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
36220 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
36230 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
36240 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
36250 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
36260 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
36270 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
36280 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
36290 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
362a0 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
362b0 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
362c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
362d0 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
362e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
362f0 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
36300 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
36310 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
36320 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
36330 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
36340 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
36350 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
36360 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
36370 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
36380 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
36390 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
363a0 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
363b0 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
363c0 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
363d0 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
363e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
363f0 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
36400 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
36410 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
36420 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
36430 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
36440 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
36450 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
36460 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
36470 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
36480 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
36490 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
364a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364b0 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
364c0 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
364d0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
364e0 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
364f0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
36500 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
36510 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
36520 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
36530 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
36540 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
36550 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
36560 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
36570 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
36580 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
36590 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
365a0 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
365b0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
365c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
365d0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
365e0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
365f0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
36600 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
36610 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
36620 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
36630 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
36640 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
36650 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
36660 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  gBase, 0, 0);.  
36670 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
36680 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
36690 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
366a0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
366b0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
366c0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
366d0 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
366e0 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
366f0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
36700 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
36710 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
36720 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
36730 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
36740 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
36750 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73  olumnToReg(pPars
36760 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
36770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36780 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
36790 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
367a0 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b  ol->iTable, r1);
367b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
367c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
367d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
367e0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
367f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
36800 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
36810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
36820 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
36830 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
36840 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
36850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36860 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
36870 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
36880 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
36890 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
368a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
368b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
368c0 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
368d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
368e0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
368f0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
36900 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
36910 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
36920 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
36930 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
36940 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
36950 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
36960 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
36970 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
36980 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
36990 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
369a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
369b0 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
369c0 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
369d0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
369e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
369f0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
36a00 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
36a10 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
36a20 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
36a30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
36a40 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64  P BY sort")); Vd
36a50 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
36a60 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
36a70 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
36a80 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
36a90 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
36aa0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
36ab0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
36ac0 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d  the index or tem
36ad0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65  porary table use
36ae0 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42  d by the GROUP B
36af0 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20  Y sort.      ** 
36b00 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64  will naturally d
36b10 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74  eliver rows in t
36b20 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65  he order require
36b30 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42  d by the ORDER B
36b40 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  Y.      ** claus
36b50 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70  e, cancel the ep
36b60 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70  hemeral table op
36b70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  en coded earlier
36b80 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
36b90 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   ** This is an o
36ba0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68  ptimization - th
36bb0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
36bc0 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72   should result r
36bd0 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
36be0 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49   ** Use the SQLI
36bf0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
36c00 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45  flag with SQLITE
36c10 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
36c20 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ZER to .      **
36c30 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
36c40 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
36c50 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
36c60 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
36c70 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74  rderByGrp && Opt
36c80 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
36c90 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75  (db, SQLITE_Grou
36ca0 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20  pByOrder) .     
36cb0 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72    && (groupBySor
36cc0 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72  t || sqlite3Wher
36cd0 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f  eIsSorted(pWInfo
36ce0 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
36cf0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
36d00 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  By = 0;.        
36d10 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
36d20 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
36d30 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
36d40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
36d50 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
36d60 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
36d70 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
36d80 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
36d90 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
36da0 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
36db0 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
36dc0 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
36dd0 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
36de0 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
36df0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
36e00 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
36e10 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
36e20 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
36e30 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
36e40 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
36e50 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
36e60 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
36e70 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
36e80 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
36e90 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
36ea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
36eb0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
36ec0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
36ed0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
36ee0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36ef0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
36f00 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
36f10 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  o.sortingIdx,.  
36f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f30 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c          sortOut,
36f40 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20   sortPTab);.    
36f50 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
36f60 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
36f70 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
36f80 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
36f90 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
36fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36fb0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
36fc0 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
36fd0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
36fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36ff0 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
37000 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
37010 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
37020 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
37030 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
37040 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
37050 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37070 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
37080 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
37090 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
370a0 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
370b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
370c0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
370d0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
370e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
370f0 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
37100 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
37110 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
37120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
37130 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
37140 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29  1+1, 0, addr1+1)
37150 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
37160 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
37170 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
37180 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
37190 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
371a0 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
371b0 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
371c0 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
371d0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
371e0 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
371f0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
37200 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
37210 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
37220 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
37230 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
37240 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
37250 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
37260 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
37270 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
37280 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
37290 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
372a0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
372b0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
372c0 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
372d0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
372e0 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
372f0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
37300 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
37310 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
37320 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
37330 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
37340 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
37350 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
37360 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
37370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37380 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
37390 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
373a0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
373b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
373c0 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
373d0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
373e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
373f0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
37400 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
37410 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
37420 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
37430 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
37440 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
37450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37460 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
37470 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
37480 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
37490 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
374a0 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
374b0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
374c0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
374d0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
374e0 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
374f0 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
37500 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
37510 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
37520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
37530 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
37540 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
37550 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
37560 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
37570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37580 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
37590 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
375a0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
375b0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
375c0 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
375d0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
375e0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
375f0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
37600 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
37610 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
37620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37630 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
37640 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
37650 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
37660 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  OfLoop);.       
37670 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
37680 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
37690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
376a0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
376b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
376c0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
376d0 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
376e0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
376f0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
37700 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
37710 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
37720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37730 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
37740 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
37750 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
37760 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
37770 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
37780 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
37790 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
377a0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
377b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
377c0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
377d0 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  v, addrEnd);..  
377e0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
377f0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
37800 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
37810 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
37820 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
37830 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
37840 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
37850 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
37860 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
37870 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
37880 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
37890 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
378a0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
378b0 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
378c0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
378d0 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
378e0 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
378f0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
37900 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
37910 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
37920 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
37930 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
37940 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
37950 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
37960 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
37970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
37980 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
37990 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
379a0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
379b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
379c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
379d0 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
379e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
379f0 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
37a00 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
37a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37a20 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
37a30 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
37a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37a50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
37a60 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
37a70 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
37a80 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
37a90 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
37aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
37ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
37ac0 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
37ad0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
37ae0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
37af0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
37b00 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
37b10 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
37b20 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
37b30 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
37b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
37b50 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
37b60 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
37b70 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
37b80 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
37b90 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
37ba0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
37bb0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
37bc0 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
37bd0 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
37be0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
37bf0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
37c00 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
37c10 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20   &sSort,.       
37c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
37c30 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
37c40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37c50 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
37c60 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
37c70 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
37c80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
37c90 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
37ca0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
37cb0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
37cc0 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
37cd0 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
37ce0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
37cf0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
37d00 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
37d10 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
37d20 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
37d30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
37d40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
37d50 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
37d60 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
37d70 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
37d80 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
37d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37da0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
37db0 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
37dc0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
37dd0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
37de0 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
37df0 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
37e00 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
37e10 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66 20   else {.#ifndef 
37e20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
37e30 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
37e40 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
37e50 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
37e60 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
37e70 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
37e80 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
37e90 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
37ea0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
37eb0 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
37ec0 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
37ed0 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
37ee0 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
37ef0 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
37f00 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
37f10 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
37f20 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
37f30 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
37f40 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
37f50 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
37f60 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
37f70 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
37f80 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
37f90 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
37fa0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
37fb0 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
37fc0 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
37fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
37fe0 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
37ff0 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
38000 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
38010 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
38020 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
38030 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
38040 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
38050 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
38060 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
38070 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
38080 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
38090 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
380a0 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
380b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
380c0 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
380d0 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
380e0 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
380f0 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
38100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
38110 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
38120 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
38130 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
38140 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
38150 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
38160 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
38170 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
38180 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
38190 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
381a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
381b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381c0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
381d0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
381e0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
381f0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
38200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
38210 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
38220 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
38230 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
38240 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
38250 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
38260 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
38270 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
38280 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
38290 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
382a0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
382b0 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
382c0 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
382d0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
382e0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
382f0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
38300 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
38310 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
38320 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
38330 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
38340 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
38350 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
38360 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
38370 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
38380 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
38390 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
383a0 74 20 64 6f 20 61 20 66 75 6c 6c