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

Artifact 29294be54b5ef53e3359d37b394dc0077f5a594f9d07f06c5eabd1e3830abd9f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%s/%d/%p: ",(S)
02c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28 50 29 2d 3e  ->zSelName,(P)->
02d0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 28 53 29 29  addrExplain,(S))
02e0: 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ,\.    sqlite3De
02f0: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0300: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43  e.# define SELEC
0310: 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a  TTRACE(K,P,S,X).
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
0330: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0350: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0360: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0370: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
0380: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
0390: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
03a0: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
03b0: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
03c0: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
03d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
03e0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
03f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
0400: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
0410: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
0420: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
0430: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
0440: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
0450: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0460: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
0470: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
0480: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
0490: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
04a0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
04b0: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
04c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
04d0: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
04e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
04f0: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
0500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
0510: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
0520: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
0530: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
0540: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0560: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0570: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0580: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52   about.** the OR
0590: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
05a0: 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71   BY) clause of q
05b0: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f  uery is being co
05c0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ded..**.** The a
05d0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
05e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72   used by the sor
05f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f  ter-references o
0600: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72  ptimization. For
0610: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
0620: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
0630: 6f 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  o index that can
0640: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0650: 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f   ORDER BY,.** fo
0660: 72 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  r the query:.**.
0670: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c  **     SELECT a,
0680: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
0690: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
06a0: 54 20 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d  T 10;.**.** it m
06b0: 61 79 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  ay be more effic
06c0: 69 65 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74  ient to add just
06d0: 20 74 68 65 20 22 61 22 20 76 61 6c 75 65 73 20   the "a" values 
06e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61  to the sorter, a
06f0: 6e 64 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  nd.** retrieve t
0700: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 62  he associated "b
0710: 69 67 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64  igblob" values d
0720: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
0730: 6c 65 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20  le t1 as the.** 
0740: 31 30 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20  10 smallest "a" 
0750: 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
0760: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f  cted from the so
0770: 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rter..**.** When
0780: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
0790: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
07a0: 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 65 72  on is used, ther
07b0: 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69  e is one entry i
07c0: 6e 20 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b  n the.** aDefer[
07d0: 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68  ] array for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
07f0: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 61 64  that may be read
0800: 20 61 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   as values are.*
0810: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
0820: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
0830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0840: 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a  ortCtx SortCtx;.
0850: 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b  struct SortCtx {
0860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0870: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
0880: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0890: 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f  UP BY clause) */
08a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20  .  int nOBSat;  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08c0: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
08d0: 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
08e0: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  y indices */.  i
08f0: 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20  nt iECursor;    
0900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0910: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f  umber for the so
0920: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rter */.  int re
0930: 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20  gReturn;        
0940: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
0950: 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74  ing block-output
0960: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
0970: 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b  */.  int labelBk
0980: 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  Out;       /* St
0990: 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  art label for th
09a0: 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73  e block-output s
09b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
09c0: 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
09d0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
09e0: 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  of the OP_Sorter
09f0: 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45  Open or OP_OpenE
0a00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e  phemeral */.  in
0a10: 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  t labelDone;    
0a20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0a30: 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20   when done, ex: 
0a40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f  LIMIT reached */
0a50: 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b  .  u8 sortFlags;
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
0a70: 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41   or more SORTFLA
0a80: 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38  G_* bits */.  u8
0a90: 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f   bOrderedInnerLo
0aa0: 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  op; /* ORDER BY 
0ab0: 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20  correctly sorts 
0ac0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
0ad0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0ae0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
0af0: 46 45 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44  FERENCES.  u8 nD
0b00: 65 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  efer;           
0b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
0b20: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
0b30: 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72  Defer[] */.  str
0b40: 75 63 74 20 44 65 66 65 72 72 65 64 43 73 72 20  uct DeferredCsr 
0b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
0b60: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  b;        /* Tab
0b70: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  le definition */
0b80: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20  .    int iCsr;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0ba0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
0bb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
0bc0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Key;           /
0bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  * Number of PK c
0be0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65  olumns for table
0bf0: 20 70 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20   pTab (>=1) */. 
0c00: 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65   } aDefer[4];.#e
0c10: 6e 64 69 66 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  ndif.};.#define 
0c20: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
0c30: 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73  er  0x01   /* Us
0c40: 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  e SorterOpen ins
0c50: 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65  tead of OpenEphe
0c60: 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  meral */../*.** 
0c70: 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63  Delete all the c
0c80: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65  ontent of a Sele
0c90: 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 44  ct structure.  D
0ca0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74  eallocate the st
0cb0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
0cc0: 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20  f only if bFree 
0cd0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
0ce0: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c  ic void clearSel
0cf0: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
0d00: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
0d10: 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28  bFree){.  while(
0d20: 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74   p ){.    Select
0d30: 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
0d40: 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  rior;.    sqlite
0d50: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0d60: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
0d70: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
0d80: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0d90: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
0da0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0db0: 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
0dc0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0dd0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0de0: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
0df0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0e00: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  b, p->pHaving);.
0e10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
0e20: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0e30: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
0e40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0e50: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
0e60: 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f  ;.    if( OK_IF_
0e70: 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70  ALWAYS_TRUE(p->p
0e80: 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33 57  With) ) sqlite3W
0e90: 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ithDelete(db, p-
0ea0: 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66 28  >pWith);.    if(
0eb0: 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65 33   bFree ) sqlite3
0ec0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
0ed0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ee0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ef0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0f00: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0f10: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0f20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0f30: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0f40: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0f50: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0f60: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0f70: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0f80: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0f90: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0fa0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 20  pDest->zAffSdst 
0fb0: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  = 0;.  pDest->iS
0fc0: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0fd0: 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a  ->nSdst = 0;.}..
0fe0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
0ff0: 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72  a new Select str
1000: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
1010: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1020: 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  hat.** structure
1030: 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c  ..*/.Select *sql
1040: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20  ite3SelectNew(. 
1050: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1060: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1070: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1080: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
1090: 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f       /* which co
10a0: 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65  lumns to include
10b0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
10c0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
10d0: 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  c,        /* the
10e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20   FROM clause -- 
10f0: 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20  which tables to 
1100: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
1110: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
1120: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
1130: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1140: 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f  t *pGroupBy,   /
1150: 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  * the GROUP BY c
1160: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
1170: 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20  *pHaving,       
1180: 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63   /* the HAVING c
1190: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
11a0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
11b0: 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   /* the ORDER BY
11c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33 32   clause */.  u32
11d0: 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20   selFlags,      
11e0: 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d     /* Flag param
11f0: 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53  eters, such as S
1200: 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  F_Distinct */.  
1210: 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20 20  Expr *pLimit    
1220: 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76        /* LIMIT v
1230: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
1240: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29 7b  s not used */.){
1250: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
1260: 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69  .  Select standi
1270: 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  n;.  pNew = sqli
1280: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
1290: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
12a0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
12b0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
12c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
12d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
12e0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20  led );.    pNew 
12f0: 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a  = &standin;.  }.
1300: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1310: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
1320: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1330: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
1340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 28      sqlite3Expr(
1370: 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53  pParse->db,TK_AS
1380: 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a  TERISK,0));.  }.
1390: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
13a0: 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d   pEList;.  pNew-
13b0: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
13c0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
13d0: 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20  s = selFlags;.  
13e0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
13f0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
1400: 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43  t = 0;.#if SELEC
1410: 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
1420: 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b   pNew->zSelName[
1430: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  0] = 0;.#endif.#
1440: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
1450: 4e 41 42 4c 45 44 20 7c 7c 20 21 64 65 66 69 6e  NABLED || !defin
1460: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
1470: 58 50 4c 41 49 4e 29 0a 20 20 70 4e 65 77 2d 3e  XPLAIN).  pNew->
1480: 69 53 65 6c 65 63 74 49 64 20 3d 20 30 3b 0a 23  iSelectId = 0;.#
1490: 65 6e 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61 64  endif.  pNew->ad
14a0: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
14b0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
14c0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
14d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
14e0: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  tRow = 0;.  if( 
14f0: 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d  pSrc==0 ) pSrc =
1500: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1510: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
1520: 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b   sizeof(*pSrc));
1530: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
1540: 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  pSrc;.  pNew->pW
1550: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
1560: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
1570: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e  = pGroupBy;.  pN
1580: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48  ew->pHaving = pH
1590: 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70  aving;.  pNew->p
15a0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
15b0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  By;.  pNew->pPri
15c0: 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  or = 0;.  pNew->
15d0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
15e0: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  w->pLimit = pLim
15f0: 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74  it;.  pNew->pWit
1600: 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  h = 0;.  if( pPa
1610: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1620: 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c  ailed ) {.    cl
1630: 65 61 72 53 65 6c 65 63 74 28 70 50 61 72 73 65  earSelect(pParse
1640: 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  ->db, pNew, pNew
1650: 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20  !=&standin);.   
1660: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
1670: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1680: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
1690: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
16a0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
16b0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
16c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
16d0: 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  ;.}..#if SELECTT
16e0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
16f0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
1700: 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a 65  of a Select obje
1710: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
1720: 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1730: 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74  Select *p, const
1740: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1750: 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65 20   if( p && zName 
1760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1770: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
1780: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e  ->zSelName), p->
1790: 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20  zSelName, "%s", 
17a0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  zName);.  }.}.#e
17b0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ndif.../*.** Del
17c0: 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65  ete the given Se
17d0: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
17e0: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
17f0: 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a  bstructures..*/.
1800: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1810: 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  ctDelete(sqlite3
1820: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29   *db, Select *p)
1830: 7b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  {.  if( OK_IF_AL
1840: 57 41 59 53 5f 54 52 55 45 28 70 29 20 29 20 63  WAYS_TRUE(p) ) c
1850: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
1860: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 1);.}../*.** R
1870: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1880: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
1890: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
18a0: 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  nt in a compound
18b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65  ..*/.static Sele
18c0: 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73  ct *findRightmos
18d0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
18e0: 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20  while( p->pNext 
18f0: 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ) p = p->pNext;.
1900: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1910: 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20  *.** Given 1 to 
1920: 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70 72  3 identifiers pr
1930: 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e  eceding the JOIN
1940: 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d   keyword, determ
1950: 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  ine the.** type 
1960: 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e  of join.  Return
1970: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
1980: 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65 73  tant that expres
1990: 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a  ses that type.**
19a0: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
19b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76   following bit v
19c0: 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
19d0: 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20   JT_INNER.**    
19e0: 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20   JT_CROSS.**    
19f0: 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20   JT_OUTER.**    
1a00: 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20   JT_NATURAL.**  
1a10: 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20     JT_LEFT.**   
1a20: 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a    JT_RIGHT.**.**
1a30: 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f   A full outer jo
1a40: 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e  in is the combin
1a50: 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54  ation of JT_LEFT
1a60: 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a   and JT_RIGHT..*
1a70: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67  *.** If an illeg
1a80: 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  al or unsupporte
1a90: 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73  d join type is s
1aa0: 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  een, then still 
1ab0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e  return.** a join
1ac0: 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20 61   type, but put a
1ad0: 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70  n error in the p
1ae0: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
1af0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  .*/.int sqlite3J
1b00: 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  oinType(Parse *p
1b10: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41  Parse, Token *pA
1b20: 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b  , Token *pB, Tok
1b30: 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a  en *pC){.  int j
1b40: 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54  ointype = 0;.  T
1b50: 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a  oken *apAll[3];.
1b60: 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20    Token *p;.    
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31           /*   01
1b90: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
1ba0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1bb0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
1bc0: 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74  st char zKeyText
1bd0: 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74  [] = "naturaleft
1be0: 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e  outerightfullinn
1bf0: 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74  ercross";.  stat
1c00: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
1c10: 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20 20  {.    u8 i;     
1c20: 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
1c30: 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20  of keyword text 
1c40: 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f  in zKeyText[] */
1c50: 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20  .    u8 nChar;  
1c60: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1c70: 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68  he keyword in ch
1c80: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20  aracters */.    
1c90: 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20  u8 code;     /* 
1ca0: 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a  Join type mask *
1cb0: 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d  /.  } aKeyword[]
1cc0: 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75   = {.    /* natu
1cd0: 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20  ral */ { 0,  7, 
1ce0: 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20  JT_NATURAL      
1cf0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1d00: 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b   /* left    */ {
1d10: 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   6,  4, JT_LEFT|
1d20: 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20  JT_OUTER        
1d30: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65    },.    /* oute
1d40: 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20  r   */ { 10, 5, 
1d50: 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20  JT_OUTER        
1d60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1d70: 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b   /* right   */ {
1d80: 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54   14, 5, JT_RIGHT
1d90: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1da0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c    },.    /* full
1db0: 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20      */ { 19, 4, 
1dc0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
1dd0: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
1de0: 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b   /* inner   */ {
1df0: 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   23, 5, JT_INNER
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73    },.    /* cros
1e20: 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20  s   */ { 28, 5, 
1e30: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53  JT_INNER|JT_CROS
1e40: 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  S         },.  }
1e50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
1e60: 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20  apAll[0] = pA;. 
1e70: 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a   apAll[1] = pB;.
1e80: 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b    apAll[2] = pC;
1e90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20  .  for(i=0; i<3 
1ea0: 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b  && apAll[i]; i++
1eb0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c  ){.    p = apAll
1ec0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  [i];.    for(j=0
1ed0: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b  ; j<ArraySize(aK
1ee0: 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20  eyword); j++){. 
1ef0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61       if( p->n==a
1f00: 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72  Keyword[j].nChar
1f10: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
1f20: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
1f30: 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65  char*)p->z, &zKe
1f40: 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a  yText[aKeyword[j
1f50: 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29  ].i], p->n)==0 )
1f60: 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79  {.        jointy
1f70: 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a  pe |= aKeyword[j
1f80: 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].code;.        
1f90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1fa0: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1fb0: 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20  e( j==0 || j==1 
1fc0: 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20  || j==2 || j==3 
1fd0: 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20  || j==4 || j==5 
1fe0: 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69  || j==6 );.    i
1ff0: 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( j>=ArraySize(
2000: 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20  aKeyword) ){.   
2010: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a     jointype |= J
2020: 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  T_ERROR;.      b
2030: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2040: 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e    if(.     (join
2050: 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52  type & (JT_INNER
2060: 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54  |JT_OUTER))==(JT
2070: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
2080: 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79   ||.     (jointy
2090: 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d  pe & JT_ERROR)!=
20a0: 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  0.  ){.    const
20b0: 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22   char *zSp = " "
20c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
20d0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
20e0: 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d  C==0 ){ zSp++; }
20f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2100: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
2110: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
2120: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
2130: 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25  ".       "%T %T%
2140: 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53  s%T", pA, pB, zS
2150: 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  p, pC);.    join
2160: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2170: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f  .  }else if( (jo
2180: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
2190: 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  R)!=0 .         
21a0: 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28  && (jointype & (
21b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54  JT_LEFT|JT_RIGHT
21c0: 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  ))!=JT_LEFT ){. 
21d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21e0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
21f0: 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c    "RIGHT and FUL
2200: 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72  L OUTER JOINs ar
2210: 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  e not currently 
2220: 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20  supported");.   
2230: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2240: 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NNER;.  }.  retu
2250: 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a  rn jointype;.}..
2260: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2270: 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   index of a colu
2280: 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20  mn in a table.  
2290: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
22a0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f   column.** is no
22b0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
22c0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
22d0: 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e  tic int columnIn
22e0: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  dex(Table *pTab,
22f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2300: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
2310: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
2320: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2330: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2340: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  mp(pTab->aCol[i]
2350: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
2360: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
2370: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
2380: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
2390: 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73  e first N tables
23a0: 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c   in pSrc, from l
23b0: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f  eft to right, lo
23c0: 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74  oking for a.** t
23d0: 61 62 6c 65 20 74 68 61 74 20 68 61 73 20 61 20  able that has a 
23e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f  column named zCo
23f0: 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  l.  .**.** When 
2400: 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61  found, set *piTa
2410: 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20  b and *piCol to 
2420: 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20  the table index 
2430: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  and column index
2440: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68  .** of the match
2450: 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72  ing column and r
2460: 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a  eturn TRUE..**.*
2470: 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  * If not found, 
2480: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
2490: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c  .static int tabl
24a0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
24b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
24c0: 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ,       /* Array
24d0: 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
24e0: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  arch */.  int N,
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2500: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  * Number of tabl
2510: 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  es in pSrc->a[] 
2520: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63  to search */.  c
2530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
2540: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2550: 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65  he column we are
2560: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2570: 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20    int *piTab,   
2580: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2590: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
25a0: 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  [] here */.  int
25b0: 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20   *piCol         
25c0: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
25d0: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54   of pSrc->a[*piT
25e0: 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d  ab].pTab->aCol[]
25f0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2600: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2610: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2620: 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
2630: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2640: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2650: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
2660: 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c  mn matching zCol
2670: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
2680: 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f  piTab==0)==(piCo
2690: 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74  l==0) );  /* Bot
26a0: 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65  h or neither are
26b0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69   NULL */.  for(i
26c0: 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<N; i++){. 
26d0: 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e     iCol = column
26e0: 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d  Index(pSrc->a[i]
26f0: 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20  .pTab, zCol);.  
2700: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
2710: 0a 20 20 20 20 20 20 69 66 28 20 70 69 54 61 62  .      if( piTab
2720: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54   ){.        *piT
2730: 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ab = i;.        
2740: 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  *piCol = iCol;. 
2750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2760: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
2770: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2780: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2790: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
27a0: 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64  dd terms implied
27b0: 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20   by JOIN syntax 
27c0: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
27d0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
27e0: 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  n of a SELECT st
27f0: 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77  atement. The new
2800: 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20   term, which.** 
2810: 69 73 20 41 4e 44 65 64 20 77 69 74 68 20 74 68  is ANDed with th
2820: 65 20 65 78 69 73 74 69 6e 67 20 57 48 45 52 45  e existing WHERE
2830: 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74   clause, is of t
2840: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
2850: 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74    (tab1.col1 = t
2860: 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20  ab2.col2).**.** 
2870: 77 68 65 72 65 20 74 61 62 31 20 69 73 20 74 68  where tab1 is th
2880: 65 20 69 53 72 63 27 74 68 20 74 61 62 6c 65 20  e iSrc'th table 
2890: 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 20  in SrcList pSrc 
28a0: 61 6e 64 20 74 61 62 32 20 69 73 20 74 68 65 20  and tab2 is the 
28b0: 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e  .** (iSrc+1)'th.
28c0: 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20   Column col1 is 
28d0: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20  column iColLeft 
28e0: 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c  of tab1, and col
28f0: 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69  2 is.** column i
2900: 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32  ColRight of tab2
2910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2920: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
2930: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
2960: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
2970: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
2980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2990: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52   of tables in FR
29a0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
29b0: 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20  nt iLeft,       
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29d0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
29e0: 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69   table to join i
29f0: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2a00: 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20  iColLeft,       
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a20: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
2a30: 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  n first table */
2a40: 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20  .  int iRight,  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
2a70: 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70  econd table in p
2a80: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
2a90: 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  lRight,         
2aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2ab0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73  x of column in s
2ac0: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
2ad0: 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e   int isOuterJoin
2ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2af0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2b00: 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69   is an OUTER joi
2b10: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
2b20: 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20  Where           
2b30: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2b40: 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  : The WHERE clau
2b50: 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a  se to add to */.
2b60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2b70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2b80: 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78   Expr *pE1;.  Ex
2b90: 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20  pr *pE2;.  Expr 
2ba0: 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pEq;..  assert(
2bb0: 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b   iLeft<iRight );
2bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2bd0: 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a  >nSrc>iRight );.
2be0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
2bf0: 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b  a[iLeft].pTab );
2c00: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2c10: 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20  >a[iRight].pTab 
2c20: 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69  );..  pE1 = sqli
2c30: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
2c40: 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c  xpr(db, pSrc, iL
2c50: 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a  eft, iColLeft);.
2c60: 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43    pE2 = sqlite3C
2c70: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2c80: 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74  db, pSrc, iRight
2c90: 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20  , iColRight);.. 
2ca0: 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45   pEq = sqlite3PE
2cb0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45  xpr(pParse, TK_E
2cc0: 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a 20 20  Q, pE1, pE2);.  
2cd0: 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74  if( pEq && isOut
2ce0: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
2cf0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
2d00: 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  q, EP_FromJoin);
2d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2d20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2d30: 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  q, EP_TokenOnly|
2d40: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2d50: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2d60: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f  perty(pEq, EP_No
2d70: 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71  Reduce);.    pEq
2d80: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2d90: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2da0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2db0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2dc0: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
2dd0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
2de0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
2df0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2e00: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
2e10: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
2e20: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2e30: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2e40: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2e50: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2e60: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2e70: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2e80: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2e90: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2ea0: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2eb0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2ec0: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
2ed0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
2ee0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
2ef0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
2f00: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
2f10: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
2f20: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2f30: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2f40: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2f50: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2f60: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2f70: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2f80: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2f90: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2fa0: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2fb0: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2fc0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
2fd0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
2fe0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
2ff0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
3000: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
3010: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
3020: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
3030: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
3040: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
3050: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
3060: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
3070: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
3080: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
3090: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
30a0: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
30b0: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
30c0: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
30d0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
30e0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
30f0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
3100: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3110: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
3120: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
3130: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
3140: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
3150: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
3160: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
3170: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
3180: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
3190: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
31a0: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
31b0: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
31c0: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
31d0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
31e0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
31f0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
3200: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
3210: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
3220: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
3230: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
3240: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
3250: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
3260: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
3270: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
3280: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
3290: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
32a0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
32b0: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
32c0: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
32d0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
32e0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
32f0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
3300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
3310: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
3320: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
3330: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
3340: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
3350: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
3360: 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67  ce);.    p->iRig
3370: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
3380: 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69  16)iTable;.    i
3390: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  f( p->op==TK_FUN
33a0: 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c  CTION && p->x.pL
33b0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
33c0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
33d0: 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  0; i<p->x.pList-
33e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
33f0: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
3400: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
3410: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
3420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3430: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
3440: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
3450: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
3460: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
3470: 2a 20 55 6e 64 6f 20 74 68 65 20 77 6f 72 6b 20  * Undo the work 
3480: 6f 66 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 29  of setJoinExpr()
3490: 2e 20 20 49 6e 20 74 68 65 20 65 78 70 72 65 73  .  In the expres
34a0: 73 69 6f 6e 20 74 72 65 65 20 70 2c 20 63 6f 6e  sion tree p, con
34b0: 76 65 72 74 20 65 76 65 72 79 0a 2a 2a 20 74 65  vert every.** te
34c0: 72 6d 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65  rm that is marke
34d0: 64 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f  d with EP_FromJo
34e0: 69 6e 20 61 6e 64 20 69 52 69 67 68 74 4a 6f 69  in and iRightJoi
34f0: 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 69  nTable==iTable i
3500: 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  nto.** an ordina
3510: 72 79 20 74 65 72 6d 20 74 68 61 74 20 6f 6d 69  ry term that omi
3520: 74 73 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ts the EP_FromJo
3530: 69 6e 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54  in mark..**.** T
3540: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
3550: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 69 73 20   a LEFT JOIN is 
3560: 73 69 6d 70 6c 69 66 69 65 64 20 69 6e 74 6f 20  simplified into 
3570: 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e  an ordinary JOIN
3580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3590: 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 45   unsetJoinExpr(E
35a0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
35b0: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
35c0: 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  ){.    if( ExprH
35d0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
35e0: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
35f0: 26 26 20 28 69 54 61 62 6c 65 3c 30 20 7c 7c 20  && (iTable<0 || 
3600: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
3610: 6c 65 3d 3d 69 54 61 62 6c 65 29 20 29 7b 0a 20  le==iTable) ){. 
3620: 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72       ExprClearPr
3630: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
3640: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  mJoin);.    }.  
3650: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3660: 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78  FUNCTION && p->x
3670: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  .pList ){.      
3680: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
3690: 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69  (i=0; i<p->x.pLi
36a0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
36b0: 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  .        unsetJo
36c0: 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73  inExpr(p->x.pLis
36d0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
36e0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
36f0: 20 20 20 20 7d 0a 20 20 20 20 75 6e 73 65 74 4a      }.    unsetJ
3700: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
3710: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
3720: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
3730: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
3740: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
3750: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
3760: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
3770: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
3780: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
3790: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
37a0: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
37b0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
37c0: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
37d0: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
37e0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
37f0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
3800: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
3810: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
3820: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
3830: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
3840: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
3850: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
3860: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
3870: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
3880: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
3890: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
38a0: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
38b0: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
38c0: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
38d0: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
38e0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
38f0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
3900: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
3910: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
3920: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
3930: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
3940: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
3950: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
3960: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
3970: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
3980: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
3990: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
39a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
39b0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
39c0: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
39d0: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
39e0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
39f0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
3a00: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
3a10: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
3a20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3a30: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3a40: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3a50: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3a60: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3a80: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3a90: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3aa0: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3ab0: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3ac0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3ad0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3ae0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
3af0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
3b00: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
3b10: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
3b20: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
3b30: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3b40: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3b50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3b60: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3b70: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3b80: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  ){.    Table *pR
3b90: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
3ba0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20  ->pTab;.    int 
3bb0: 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66  isOuter;..    if
3bc0: 28 20 4e 45 56 45 52 28 70 4c 65 66 74 2d 3e 70  ( NEVER(pLeft->p
3bd0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
3be0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
3bf0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
3c00: 3d 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  = (pRight->fg.jo
3c10: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
3c20: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
3c30: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
3c40: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
3c50: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
3c60: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
3c70: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
3c80: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
3c90: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
3ca0: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
3cb0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67    if( pRight->fg
3cc0: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
3cd0: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
3ce0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
3cf0: 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  || pRight->pUsin
3d00: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
3d10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3d20: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
3d30: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
3d40: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
3d50: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
3d60: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
3d70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
3d90: 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62  j=0; j<pRightTab
3da0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3db0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
3dc0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
3dd0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69  column in the ri
3de0: 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ght table */.   
3df0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
3e00: 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
3e10: 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  left table */.  
3e20: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3e30: 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67  ol;  /* Matching
3e40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c   column in the l
3e50: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  eft table */..  
3e60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52        zName = pR
3e70: 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  ightTab->aCol[j]
3e80: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3e90: 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  if( tableAndColu
3ea0: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3eb0: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3ec0: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a  , &iLeftCol) ){.
3ed0: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
3ee0: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3ef0: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3f00: 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20  tCol, i+1, j,.  
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
3f30: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
3f40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3f50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c   }..    /* Disal
3f60: 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  low both ON and 
3f70: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e  USING clauses in
3f80: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20   the same join. 
3f90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3fa0: 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69  ight->pOn && pRi
3fb0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3fd0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
3fe0: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
3ff0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
4000: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
4010: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
4020: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4030: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
4040: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
4050: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
4060: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4070: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
4080: 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70      ** an AND op
4090: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  erator..    */. 
40a0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
40b0: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
40c0: 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69  isOuter ) setJoi
40d0: 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f  nExpr(pRight->pO
40e0: 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73  n, pRight->iCurs
40f0: 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57  or);.      p->pW
4100: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
4110: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
4120: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69  , p->pWhere, pRi
4130: 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  ght->pOn);.     
4140: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30   pRight->pOn = 0
4150: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4160: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
4170: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
4180: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
4190: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
41a0: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
41b0: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
41c0: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
41d0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
41e0: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
41f0: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
4200: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
4210: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
4220: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
4230: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
4240: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
4250: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
4260: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
4270: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
4280: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
4290: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
42a0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
42b0: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
42c0: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
42d0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
42e0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
42f0: 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  ( pRight->pUsing
4300: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
4310: 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74   *pList = pRight
4320: 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20  ->pUsing;.      
4330: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74  for(j=0; j<pList
4340: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
4350: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
4360: 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
4370: 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65   the term in the
4380: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f   USING clause */
4390: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
43a0: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ft;       /* Tab
43b0: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77  le on the left w
43c0: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  ith matching col
43d0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
43e0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
43f0: 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ;    /* Column n
4400: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
4410: 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  g column on the 
4420: 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  left */.        
4430: 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20  int iRightCol;  
4440: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
4450: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
4460: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68  lumn on the righ
4470: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  t */..        zN
4480: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
4490: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
44a0: 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c   iRightCol = col
44b0: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
44c0: 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab, zName);.    
44d0: 20 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f      if( iRightCo
44e0: 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  l<0.         || 
44f0: 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49  !tableAndColumnI
4500: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
4510: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
4520: 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20  iLeftCol).      
4530: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
4540: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4550: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a  Parse, "cannot j
4560: 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e  oin using column
4570: 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20   %s - column ". 
4580: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
4590: 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20  present in both 
45a0: 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b  tables", zName);
45b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
45c0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
45d0: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
45e0: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
45f0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
4600: 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f  l, i+1, iRightCo
4610: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
4620: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
4630: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
4640: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4650: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4660: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4670: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65  nce */.static Ke
4680: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
4690: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
46a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
46b0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
46c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
46d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
46e0: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
46f0: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
4700: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
4710: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
4720: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
4730: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
4740: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
4750: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
4760: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4770: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
4780: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
4790: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  /.);../*.** Gene
47a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
47b0: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
47c0: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
47d0: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
47e0: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
47f0: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
4800: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4810: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
4820: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4830: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
4840: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4850: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
4860: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
4870: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4880: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4890: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
48a0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
48b0: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
48c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
48d0: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
48e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
48f0: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
4900: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
4910: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
4920: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
4930: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4940: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4950: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
4960: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
4970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4980: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4990: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
49a0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
49b0: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
49c0: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
49d0: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
49e0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
49f0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4a00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
4a30: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
4a40: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
4a50: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
4a60: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4a70: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4a80: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4a90: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4aa0: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4ab0: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4ac0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4ad0: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4ae0: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4af0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4b00: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
4b10: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
4b20: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
4b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
4b60: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4b70: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4b80: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4b90: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4ba0: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4bb0: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4bd0: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4bf0: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4c00: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
4c10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
4c40: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
4c50: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
4c60: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69  r */.  int iLimi
4c70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
4c90: 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  IT counter */.. 
4ca0: 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30   assert( bSeq==0
4cb0: 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20   || bSeq==1 );. 
4cc0: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
4cd0: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
4ce0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
4cf0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20  OrigData==0 );. 
4d00: 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20   if( nPrefixReg 
4d10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
4d20: 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72  PrefixReg==nExpr
4d30: 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67  +bSeq );.    reg
4d40: 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d  Base = regData -
4d50: 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20   nExpr - bSeq;. 
4d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42   }else{.    regB
4d70: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
4d80: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72  em + 1;.    pPar
4d90: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73  se->nMem += nBas
4da0: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
4db0: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
4dc0: 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d  t==0 || pSelect-
4dd0: 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >iLimit!=0 );.  
4de0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4df0: 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c  ->iOffset ? pSel
4e00: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ect->iOffset+1 :
4e10: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4e20: 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  ;.  pSort->label
4e30: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4e40: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4e50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4e60: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4e70: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
4e80: 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f  y, regBase, regO
4e90: 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20  rigData,.       
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
4ec0: 55 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74  UP | (regOrigDat
4ed0: 61 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  a? SQLITE_ECEL_R
4ee0: 45 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20  EF : 0));.  if( 
4ef0: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
4f00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4f10: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4f20: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4f30: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
4f40: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
4f50: 52 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e  Reg==0 && nData>
4f60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4f70: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
4f80: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
4f90: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
4fa0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
4fb0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
4fc0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4fd0: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4fe0: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4ff0: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
5000: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
5010: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
5020: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
5030: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
5040: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
5050: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
5060: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
5070: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
5080: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
5090: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
50a0: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
50b0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
50c0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
50d0: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
50e0: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
50f0: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
5100: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
5110: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
5120: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
5130: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
5140: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 73 71  table */..    sq
5150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5160: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5170: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
5180: 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 72  , nBase-nOBSat,r
5190: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 72  egRecord);.    r
51a0: 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72  egPrevKey = pPar
51b0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
51c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
51d0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
51e0: 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20     nKey = nExpr 
51f0: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20  - pSort->nOBSat 
5200: 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20  + bSeq;.    if( 
5210: 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64  bSeq ){.      ad
5220: 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
5230: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5240: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65  P_IfNot, regBase
5250: 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65  +nExpr); .    }e
5260: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46  lse{.      addrF
5270: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5280: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
5290: 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f  equenceTest, pSo
52a0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
52b0: 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76     }.    VdbeCov
52c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
52d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
52e0: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
52f0: 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61  egPrevKey, regBa
5300: 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  se, pSort->nOBSa
5310: 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71  t);.    pOp = sq
5320: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
5330: 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72  , pSort->addrSor
5340: 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  tIndex);.    if(
5350: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
5360: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
5370: 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20  rn;.    pOp->p2 
5380: 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a  = nKey + nData;.
5390: 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70      pKI = pOp->p
53a0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
53b0: 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72  memset(pKI->aSor
53c0: 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e  tOrder, 0, pKI->
53d0: 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d  nKeyField); /* M
53e0: 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73  akes OP_Jump tes
53f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
5400: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5410: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
5420: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
5430: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
5440: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20  KI->nAllField > 
5450: 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32  pKI->nKeyField+2
5460: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
5470: 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
5480: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
5490: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f  Parse, pSort->pO
54a0: 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a  rderBy, nOBSat,.
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 20 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e             pKI->
54e0: 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e  nAllField-pKI->n
54f0: 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20  KeyField-1);.   
5500: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
5510: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5520: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
5530: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5540: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
5550: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
5560: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5570: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
5580: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
5590: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
55a0: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
55b0: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
55c0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
55d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
55e0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
55f0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
5600: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5610: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5620: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5630: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
5640: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
5650: 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b     if( iLimit ){
5660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5680: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53  fNot, iLimit, pS
5690: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b  ort->labelDone);
56a0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
56b0: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
56c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
56d0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72  pHere(v, addrFir
56e0: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
56f0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
5700: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  rse, regBase, re
5710: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
5720: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
5730: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5740: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
5750: 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20   }.  if( iLimit 
5760: 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  ){.    /* At thi
5770: 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c 75  s point the valu
5780: 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  es for the new s
5790: 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65 20  orter entry are 
57a0: 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e  stored.    ** in
57b0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
57c0: 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65 65  isters. They nee
57d0: 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64  d to be composed
57e0: 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a 20   into a record. 
57f0: 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74     ** and insert
5800: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
5810: 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61 29  er if either (a)
5820: 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
5830: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73  ntly.    ** less
5840: 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53   than LIMIT+OFFS
5850: 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29 20  ET items or (b) 
5860: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
5870: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
5880: 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67 65      ** the large
5890: 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  st record curren
58a0: 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  tly in the sorte
58b0: 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72 75  r. If (b) is tru
58c0: 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20 20  e and there.    
58d0: 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 4c  ** are already L
58e0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
58f0: 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  s in the sorter,
5900: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72 67   delete the larg
5910: 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  est.    ** entry
5920: 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e   before insertin
5930: 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54  g the new one. T
5940: 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61 72  his way there ar
5950: 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20 20  e never more .  
5960: 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b    ** than LIMIT+
5970: 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20  OFFSET items in 
5980: 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20 20  the sorter..    
5990: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
59a0: 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73   new record does
59b0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
59c0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
59d0: 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a  e sorter,.    **
59e0: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
59f0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
5a00: 68 65 20 6c 6f 6f 70 2e 20 4f 72 2c 20 69 66 20  he loop. Or, if 
5a10: 74 68 65 0a 20 20 20 20 2a 2a 20 70 53 6f 72 74  the.    ** pSort
5a20: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5a30: 6f 6f 70 20 66 6c 61 67 20 69 73 20 73 65 74 20  oop flag is set 
5a40: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
5a50: 20 74 68 65 20 69 6e 6e 65 72 0a 20 20 20 20 2a   the inner.    *
5a60: 2a 20 6c 6f 6f 70 20 64 65 6c 69 76 65 72 73 20  * loop delivers 
5a70: 69 74 65 6d 73 20 69 6e 20 73 6f 72 74 65 64 20  items in sorted 
5a80: 6f 72 64 65 72 2c 20 6a 75 6d 70 20 74 6f 20 74  order, jump to t
5a90: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
5aa0: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
5ab0: 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 20 20  outer loop..    
5ac0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20  */.    int iCsr 
5ad0: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
5ae0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 4a 6d 70 20  r;.    int iJmp 
5af0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5b00: 72 65 6e 74 41 64 64 72 28 76 29 2b 35 2b 28 6e  rentAddr(v)+5+(n
5b10: 4f 42 53 61 74 3c 3d 30 29 2b 70 53 6f 72 74 2d  OBSat<=0)+pSort-
5b20: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
5b30: 6f 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  op;.    assert( 
5b40: 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49  pSort->bOrderedI
5b50: 6e 6e 65 72 4c 6f 6f 70 3d 3d 30 20 7c 7c 20 70  nnerLoop==0 || p
5b60: 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Sort->bOrderedIn
5b70: 6e 65 72 4c 6f 6f 70 3d 3d 31 20 29 3b 0a 20 20  nerLoop==1 );.  
5b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5b90: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a  Op2(v, OP_IfNotZ
5ba0: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 73 71 6c  ero, iLimit, sql
5bb0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5bc0: 64 64 72 28 76 29 2b 34 29 3b 0a 20 20 20 20 56  ddr(v)+4);.    V
5bd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5bf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp2(v, OP_Last
5c00: 2c 20 69 43 73 72 2c 20 30 29 3b 0a 20 20 20 20  , iCsr, 0);.    
5c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c20: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45  4Int(v, OP_IdxLE
5c30: 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2c 20 72 65  , iCsr, iJmp, re
5c40: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 45  gBase+nOBSat, nE
5c50: 78 70 72 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 20  xpr-nOBSat);.   
5c60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5c70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5c80: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
5c90: 6c 65 74 65 2c 20 69 43 73 72 29 3b 0a 20 20 7d  lete, iCsr);.  }
5ca0: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3c 3d 30  .  if( nOBSat<=0
5cb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
5cc0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5cd0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
5ce0: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
5cf0: 65 2d 6e 4f 42 53 61 74 2c 72 65 67 52 65 63 6f  e-nOBSat,regReco
5d00: 72 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rd);.  }.  if( p
5d10: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
5d20: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
5d30: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
5d40: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
5d50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
5d60: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
5d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
5d80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
5d90: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
5da0: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
5dd0: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
5de0: 53 61 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Sat);.}../*.** A
5df0: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
5e00: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
5e10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5e20: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
5e30: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
5e40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5e50: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
5e60: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
5e70: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5e80: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5e90: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5ea0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5eb0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5ec0: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5ed0: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5ee0: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5ef0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5f00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5f10: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
5f20: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
5f30: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f40: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
5f50: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
5f60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
5f70: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5f80: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5f90: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5fa0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5fb0: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5fc0: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5fd0: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5fe0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5ff0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
6000: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
6010: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
6020: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
6030: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
6040: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
6050: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
6060: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
6070: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
6080: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
6090: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
60a0: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
60b0: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
60c0: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
60d0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
60e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
60f0: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
6100: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6110: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
6120: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
6130: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6140: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
6150: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
6160: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
6170: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
6180: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
6190: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
61a0: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
61b0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
61c0: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
61d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
61e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
61f0: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
6200: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
6210: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
6220: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
6230: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6240: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
6250: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6260: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6270: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
6280: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
6290: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
62a0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
62b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
62c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
62d0: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
62e0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
62f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
6300: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
6310: 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e  Tab, r1, iMem, N
6320: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6330: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
6340: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
6350: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
6360: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6370: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 64 65  e, r1);.}..#ifde
6380: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6390: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
63a0: 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  S./*.** This fun
63b0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
63c0: 61 73 20 70 61 72 74 20 6f 66 20 69 6e 6e 65 72  as part of inner
63d0: 2d 6c 6f 6f 70 20 67 65 6e 65 72 61 74 69 6f 6e  -loop generation
63e0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 0a 2a 2a   for a SELECT.**
63f0: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
6400: 61 6e 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  an ORDER BY that
6410: 20 69 73 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   is not optimize
6420: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 49  d by an index. I
6430: 74 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73  t .** determines
6440: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
6450: 2c 20 69 66 20 61 6e 79 2c 20 74 68 61 74 20 74  , if any, that t
6460: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
6470: 6e 63 65 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  nce .** optimiza
6480: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 75  tion should be u
6490: 73 65 64 20 66 6f 72 2e 20 54 68 65 20 73 6f 72  sed for. The sor
64a0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70  ter-reference op
64b0: 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73  timization.** is
64c0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
64d0: 20 71 75 65 72 69 65 73 20 6c 69 6b 65 3a 0a 2a   queries like:.*
64e0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2c  *.**   SELECT a,
64f0: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
6500: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
6510: 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  T 10.**.** If th
6520: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
6530: 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
6540: 73 73 69 6f 6e 20 22 62 69 67 62 6c 6f 62 22 2c  ssion "bigblob",
6550: 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66   then instead of
6560: 0a 2a 2a 20 73 74 6f 72 69 6e 67 20 76 61 6c 75  .** storing valu
6570: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 61  es read from tha
6580: 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  t column in the 
6590: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2c 20  sorter records, 
65a0: 74 68 65 20 50 4b 20 6f 66 0a 2a 2a 20 74 68 65  the PK of.** the
65b0: 20 72 6f 77 20 66 72 6f 6d 20 74 61 62 6c 65 20   row from table 
65c0: 74 31 20 69 73 20 73 74 6f 72 65 64 20 69 6e 73  t1 is stored ins
65d0: 74 65 61 64 2e 20 54 68 65 6e 2c 20 61 73 20 72  tead. Then, as r
65e0: 65 63 6f 72 64 73 20 61 72 65 20 65 78 74 72 61  ecords are extra
65f0: 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  cted from.** the
6600: 20 73 6f 72 74 65 72 20 74 6f 20 72 65 74 75 72   sorter to retur
6610: 6e 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74  n to the user, t
6620: 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75  he required valu
6630: 65 20 6f 66 20 62 69 67 62 6c 6f 62 20 69 73 0a  e of bigblob is.
6640: 2a 2a 20 72 65 74 72 69 65 76 65 64 20 64 69 72  ** retrieved dir
6650: 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65  ectly from table
6660: 20 74 31 2e 20 49 66 20 74 68 65 20 76 61 6c 75   t1. If the valu
6670: 65 73 20 61 72 65 20 76 65 72 79 20 6c 61 72 67  es are very larg
6680: 65 2c 20 74 68 69 73 20 0a 2a 2a 20 63 61 6e 20  e, this .** can 
6690: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
66a0: 74 20 74 68 61 6e 20 73 74 6f 72 69 6e 67 20 74  t than storing t
66b0: 68 65 6d 20 64 69 72 65 63 74 6c 79 20 69 6e 20  hem directly in 
66c0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
66d0: 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  ds..**.** The Ex
66e0: 70 72 4c 69 73 74 5f 69 74 65 6d 2e 62 53 6f 72  prList_item.bSor
66f0: 74 65 72 52 65 66 20 66 6c 61 67 20 69 73 20 73  terRef flag is s
6700: 65 74 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  et for each expr
6710: 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74  ession in pEList
6720: 20 0a 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74   .** for which t
6730: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
6740: 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
6750: 20 73 68 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c   should be enabl
6760: 65 64 2e 20 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ed. .** Addition
6770: 61 6c 6c 79 2c 20 74 68 65 20 70 53 6f 72 74 2d  ally, the pSort-
6780: 3e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20  >aDefer[] array 
6790: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
67a0: 68 20 65 6e 74 72 69 65 73 0a 2a 2a 20 66 6f 72  h entries.** for
67b0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 72 65 71   all cursors req
67c0: 75 69 72 65 64 20 74 6f 20 65 76 61 6c 75 61 74  uired to evaluat
67d0: 65 20 61 6c 6c 20 73 65 6c 65 63 74 65 64 20 65  e all selected e
67e0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 69 6e 61  xpressions. Fina
67f0: 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70 75 74 20 76  lly..** output v
6800: 61 72 69 61 62 6c 65 20 28 2a 70 70 45 78 74 72  ariable (*ppExtr
6810: 61 29 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  a) is set to an 
6820: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
6830: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 65 78  containing.** ex
6840: 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 61 6c  pressions for al
6850: 6c 20 65 78 74 72 61 20 50 4b 20 76 61 6c 75 65  l extra PK value
6860: 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
6870: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
6880: 2a 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73  * sorter records
6890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
68a0: 20 73 65 6c 65 63 74 45 78 70 72 44 65 66 65 72   selectExprDefer
68b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
68c0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
68d0: 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79      /* Leave any
68e0: 20 65 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a 20   error here */. 
68f0: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 20 2f 2a 20 53 6f 72 74 65 72 20 63 6f 6e 74 65   /* Sorter conte
6920: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
6930: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
6940: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
6950: 73 73 69 6f 6e 73 20 64 65 73 74 69 6e 65 64 20  ssions destined 
6960: 66 6f 72 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  for sorter */.  
6970: 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 45 78 74  ExprList **ppExt
6980: 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
6990: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 74  /* Expressions t
69a0: 6f 20 61 70 70 65 6e 64 20 74 6f 20 73 6f 72 74  o append to sort
69b0: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  er record */.){.
69c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
69d0: 44 65 66 65 72 20 3d 20 30 3b 0a 20 20 45 78 70  Defer = 0;.  Exp
69e0: 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20  rList *pExtra = 
69f0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
6a00: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
6a10: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
6a20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6a30: 49 74 65 6d 20 3d 20 26 70 45 4c 69 73 74 2d 3e  Item = &pEList->
6a40: 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 49  a[i];.    if( pI
6a50: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
6a60: 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  yCol==0 ){.     
6a70: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
6a80: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
6a90: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
6aa0: 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
6ab0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
6ac0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
6ad0: 70 54 61 62 20 26 26 20 21 49 73 56 69 72 74 75  pTab && !IsVirtu
6ae0: 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20 20 20  al(pTab).       
6af0: 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  && (pTab->aCol[p
6b00: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 63  Expr->iColumn].c
6b10: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
6b20: 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 23 69 66  G_SORTERREF).#if
6b30: 20 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20   0.          && 
6b40: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 26 26  pTab->pSchema &&
6b50: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
6b60: 30 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  0 && !IsVirtual(
6b70: 70 54 61 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  pTab).#endif.   
6b80: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
6b90: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
6ba0: 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72 3b 20  (j=0; j<nDefer; 
6bb0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
6bc0: 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  if( pSort->aDefe
6bd0: 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78 70 72  r[j].iCsr==pExpr
6be0: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
6bf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6c00: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65 66 65      if( j==nDefe
6c10: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  r ){.          i
6c20: 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72 61 79  f( nDefer==Array
6c30: 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44 65 66  Size(pSort->aDef
6c40: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
6c50: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6c70: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b            int nK
6c80: 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ey = 1;.        
6c90: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
6ca0: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
6cb0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
6cc0: 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
6cd0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
6ce0: 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 73 71          pPk = sq
6cf0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
6d00: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
6d10: 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d            nKey =
6d20: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20   pPk->nKeyCol;. 
6d30: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6d40: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
6d50: 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a  ; k<nKey; k++){.
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
6d70: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
6d80: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
6d90: 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29  TK_COLUMN, 0, 0)
6da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6db0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
6dd0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
6de0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
6df0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6e00: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
6e10: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
6e20: 20 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d      pNew->iColum
6e30: 6e 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61  n = pPk ? pPk->a
6e40: 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b  iColumn[k] : -1;
6e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e60: 20 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65   pExtra = sqlite
6e70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6e80: 70 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20  pParse, pExtra, 
6e90: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
6ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6ec0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e   pSort->aDefer[n
6ed0: 44 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45  Defer].pTab = pE
6ee0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
6ef0: 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44         pSort->aD
6f00: 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43 73  efer[nDefer].iCs
6f10: 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  r = pExpr->iTabl
6f20: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e;.            p
6f30: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65  Sort->aDefer[nDe
6f40: 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65 79  fer].nKey = nKey
6f50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 44  ;.            nD
6f60: 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  efer++;.        
6f70: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6f80: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f        pItem->bSo
6f90: 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20 20  rterRef = 1;.   
6fa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6fb0: 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 3d   pSort->nDefer =
6fc0: 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20 2a   (u8)nDefer;.  *
6fd0: 70 70 45 78 74 72 61 20 3d 20 70 45 78 74 72 61  ppExtra = pExtra
6fe0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
6ff0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
7000: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
7010: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
7020: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
7030: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
7040: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
7050: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
7060: 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69  then the p->pELi
7070: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
7080: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
7090: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
70a0: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
70b0: 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61  s row.  If srcTa
70c0: 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20  b is.** zero or 
70d0: 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20  more, then data 
70e0: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73  is pulled from s
70f0: 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c  rcTab and p->pEL
7100: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
7110: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20   .** to get the 
7120: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
7130: 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74  s and the collat
7140: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
7150: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
7160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
7170: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
7180: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7190: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
71a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
71b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
71c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
71d0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
71e0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
71f0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
7200: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
7210: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
7220: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
7230: 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e if non-negativ
7240: 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  e */.  SortCtx *
7250: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f  pSort,         /
7260: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
7270: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
7280: 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a  ocess ORDER BY *
7290: 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
72a0: 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49  *pDistinct, /* I
72b0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f  f not NULL, info
72c0: 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65   on how to proce
72d0: 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  ss DISTINCT */. 
72e0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
72f0: 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  st,      /* How 
7300: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
7310: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
7320: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
7330: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
7340: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
7350: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
7360: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
7370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
7380: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
7390: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
73a0: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
73b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
73c0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
73d0: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
73e0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
73f0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
7400: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
7410: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
7420: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
7430: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
7440: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
7450: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
7460: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
7470: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
7480: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
7490: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
74a0: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
74b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
74c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
74d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
74e0: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d  int nPrefixReg =
74f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
7500: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
7510: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
7520: 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  regResult */..  
7530: 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52  /* Usually, regR
7540: 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72  esult is the fir
7550: 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72  st cell in an ar
7560: 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ray of memory ce
7570: 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  lls.  ** contain
7580: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
7590: 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74  result row. In t
75a0: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
75b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
75c0: 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20   ** same value. 
75d0: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
75e0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
75f0: 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f  g sent to the so
7600: 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76  rter, the.  ** v
7610: 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78  alues for any ex
7620: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
7630: 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20  re also part of 
7640: 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65  the sort-key are
7650: 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72   omitted.  ** fr
7660: 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49  om this array. I
7670: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7680: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65  rig is set to ze
7690: 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ro.  */.  int re
76a0: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
76b0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
76c0: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
76d0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73   current results
76e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
76f0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
7700: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
7710: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c  mory holding ful
7720: 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20  l result (or 0) 
7730: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
7740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7750: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
7760: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
7770: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
7780: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
7790: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
77a0: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
77b0: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
77c0: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
77d0: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
77e0: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
77f0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
7800: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
7810: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
7820: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
7830: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
7840: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
7850: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
7860: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
7870: 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
7880: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
7890: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
78a0: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
78b0: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
78c0: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
78d0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
78e0: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
78f0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
7900: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
7910: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
7920: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
7930: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
7940: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
7950: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
7960: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7970: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
7980: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
7990: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
79a0: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
79b0: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
79c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
79d0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
79e0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
79f0: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
7a00: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
7a10: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
7a20: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
7a30: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
7a40: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
7a50: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
7a60: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
7a70: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
7a80: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
7a90: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
7aa0: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
7ab0: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
7ac0: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
7ad0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
7ae0: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
7af0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
7b00: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
7b10: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
7b20: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
7b30: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
7b40: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
7b50: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
7b60: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
7b70: 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d  Col;.  regOrig =
7b80: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
7b90: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
7ba0: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
7bb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
7bc0: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
7bd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7be0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
7bf0: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
7c00: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
7c10: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
7c20: 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c  (v, "%s", p->pEL
7c30: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
7c40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
7c50: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
7c60: 45 78 69 73 74 73 20 29 7b 0a 23 69 66 64 65 66  Exists ){.#ifdef
7c70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
7c80: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
7c90: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
7ca0: 45 78 74 72 61 20 3d 20 30 3b 0a 23 65 6e 64 69  Extra = 0;.#endi
7cb0: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  f.    /* If the 
7cc0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
7cd0: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
7ce0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
7cf0: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
7d00: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
7d10: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
7d20: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
7d30: 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c  */.    u8 ecelFl
7d40: 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ags;.    if( eDe
7d50: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
7d60: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7d70: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
7d80: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7d90: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
7da0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
7db0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7dc0: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
7dd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
7de0: 72 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63  rt && hasDistinc
7df0: 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53  t==0 && eDest!=S
7e00: 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65  RT_EphemTab && e
7e10: 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
7e20: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
7e30: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
7e40: 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61  in p->pEList tha
7e50: 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61  t is a copy of a
7e60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a  n expression in.
7e70: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44        ** the ORD
7e80: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ER BY clause (pS
7e90: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20  ort->pOrderBy), 
7ea0: 73 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  set the associat
7eb0: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72  ed .      ** iOr
7ec0: 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74  derByCol value t
7ed0: 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  o one more than 
7ee0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
7ef0: 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20   ORDER BY .     
7f00: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
7f10: 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b  ithin the sort-k
7f20: 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f  ey that pushOnto
7f30: 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65  Sorter() will ge
7f40: 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a  nerate..      **
7f50: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
7f60: 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64   p->pEList field
7f70: 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66   to be omitted f
7f80: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72  rom the sorted r
7f90: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20  ecord,.      ** 
7fa0: 73 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64  saving space and
7fb0: 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f   CPU cycles.  */
7fc0: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
7fd0: 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c   |= (SQLITE_ECEL
7fe0: 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f  _OMITREF|SQLITE_
7ff0: 45 43 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20  ECEL_REF);.     
8000: 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f   for(i=pSort->nO
8010: 42 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70  BSat; i<pSort->p
8020: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8030: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
8040: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t j;.        if(
8050: 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72   (j = pSort->pOr
8060: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  derBy->a[i].u.x.
8070: 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
8080: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
8090: 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e  EList->a[j-1].u.
80a0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
80b0: 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  i+1-pSort->nOBSa
80c0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
80d0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
80e0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
80f0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
8100: 20 20 73 65 6c 65 63 74 45 78 70 72 44 65 66 65    selectExprDefe
8110: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
8120: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 45 78   p->pEList, &pEx
8130: 74 72 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tra);.      if( 
8140: 70 45 78 74 72 61 20 26 26 20 70 50 61 72 73 65  pExtra && pParse
8150: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8160: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
8170: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
8180: 20 61 6e 79 20 65 78 74 72 61 20 50 4b 20 63 6f   any extra PK co
8190: 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20 74 6f 20  lumns to add to 
81a0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
81b0: 64 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ds,.        ** a
81c0: 6c 6c 6f 63 61 74 65 20 65 78 74 72 61 20 6d 65  llocate extra me
81d0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 61  mory cells and a
81e0: 64 6a 75 73 74 20 74 68 65 20 4f 70 65 6e 45 70  djust the OpenEp
81f0: 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 20 20 20  hemeral .       
8200: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
8210: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
8220: 68 65 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64  he larger record
8230: 73 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a  s. This is only.
8240: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69          ** requi
8250: 72 65 64 20 69 66 20 74 68 65 72 65 20 61 72 65  red if there are
8260: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 49 54   one or more WIT
8270: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
8280: 73 20 77 69 74 68 0a 20 20 20 20 20 20 20 20 2a  s with.        *
8290: 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70 72 69 6d  * composite prim
82a0: 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ary keys in the 
82b0: 53 6f 72 74 43 74 78 2e 61 44 65 66 65 72 5b 5d  SortCtx.aDefer[]
82c0: 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20   array.  */.    
82d0: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
82e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
82f0: 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64  Op(v, pSort->add
8300: 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
8310: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 2b 3d 20       pOp->p2 += 
8320: 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d  (pExtra->nExpr -
8330: 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b   pSort->nDefer);
8340: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
8350: 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46  .pKeyInfo->nAllF
8360: 69 65 6c 64 20 2b 3d 20 28 70 45 78 74 72 61 2d  ield += (pExtra-
8370: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
8380: 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20  nDefer);.       
8390: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
83a0: 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a   pExtra->nExpr;.
83b0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
83c0: 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30       regOrig = 0
83d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
83e0: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c  eDest==SRT_Set |
83f0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
8400: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
8410: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8420: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
8430: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
8440: 20 7d 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f   }.    nResultCo
8450: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
8460: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
8470: 73 65 2c 70 2d 3e 70 45 4c 69 73 74 2c 72 65 67  se,p->pEList,reg
8480: 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20  Result,.        
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23   0,ecelFlags);.#
84c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
84d0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
84e0: 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 70 45  ENCES.    if( pE
84f0: 78 74 72 61 20 29 7b 0a 20 20 20 20 20 20 6e 52  xtra ){.      nR
8500: 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 73 71 6c 69  esultCol += sqli
8510: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
8520: 69 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 70  ist(.          p
8530: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 72  Parse, pExtra, r
8540: 65 67 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75  egResult + nResu
8550: 6c 74 43 6f 6c 2c 20 30 2c 20 30 0a 20 20 20 20  ltCol, 0, 0.    
8560: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
8570: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8580: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
8590: 74 72 61 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  tra);.    }.#end
85a0: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  if.  }..  /* If 
85b0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
85c0: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
85d0: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
85e0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
85f0: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
8600: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
8610: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
8620: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
8630: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
8640: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
8650: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
8660: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
8670: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
8680: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
8690: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
86a0: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
86b0: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
86c0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
86d0: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
86e0: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
86f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
8700: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
8710: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
8720: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
8730: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
8740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8750: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
8760: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
8770: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
8780: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
8790: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
87a0: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
87b0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
87c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
87d0: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
87e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
87f0: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
8800: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
8810: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
8820: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
8830: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
8840: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
8850: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
8860: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
8870: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
8880: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
8890: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
88a0: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
88b0: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
88c0: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
88d0: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
88e0: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
88f0: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
8900: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
8910: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
8920: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8930: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
8940: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
8950: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
8960: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
8970: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
8980: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
8990: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
89a0: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
89b0: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
89c0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
89d0: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
89e0: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
89f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8a00: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
8a10: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
8a20: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
8a30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
8a40: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8a50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
8a60: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
8a70: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
8a80: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
8a90: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
8aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8ab0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ac0: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
8ad0: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
8ae0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
8af0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
8b00: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
8b10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8b30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
8b40: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
8b50: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
8b60: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
8b70: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
8b80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
8b90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8ba0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
8bb0: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
8bc0: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
8bd0: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
8be0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8bf0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
8c00: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
8c10: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
8c20: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
8c30: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
8c40: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
8c50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8c60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8c70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8c80: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
8c90: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
8ca0: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
8cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8cc0: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
8cd0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
8ce0: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
8cf0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8d00: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
8d10: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
8d20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8d30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
8d40: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
8d50: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
8d60: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
8d70: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
8d80: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
8d90: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
8da0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
8db0: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
8dc0: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
8dd0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
8de0: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
8df0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
8e00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
8e10: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
8e20: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
8e30: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
8e40: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
8e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
8e60: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
8e70: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
8e80: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
8e90: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
8ea0: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
8eb0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
8ec0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
8ed0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8ee0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8ef0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
8f00: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
8f10: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
8f20: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8f30: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8f50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8f60: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
8f70: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8f80: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
8f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
8fa0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
8fb0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
8fc0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8fd0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
8fe0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
8ff0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9000: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9010: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
9020: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
9030: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
9040: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
9050: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
9060: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
9070: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
9080: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
9090: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
90a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
90b0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
90c0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
90d0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
90e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
90f0: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
9100: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
9110: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
9120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9130: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9140: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9150: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
9160: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
9170: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
9180: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
9190: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
91a0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
91b0: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
91c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
91d0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
91e0: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
91f0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
9200: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
9210: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
9220: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
9230: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
9240: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
9250: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9260: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
9270: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9280: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
9290: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
92a0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
92b0: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
92c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
92d0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
92e0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
92f0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
9300: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
9310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9320: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
9330: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
9340: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
9350: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
9360: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
9370: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
9380: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
9390: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
93a0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
93b0: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
93c0: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
93d0: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
93e0: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
93f0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
9400: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
9410: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
9420: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
9430: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
9440: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
9450: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
9460: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
9470: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
9480: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
9490: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
94a0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
94b0: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
94c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
94d0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
94e0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
94f0: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
9500: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
9510: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
9520: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9530: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9540: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
9550: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
9560: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
9570: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
9580: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
9590: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
95a0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
95b0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
95c0: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
95d0: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67  1+nPrefixReg,reg
95e0: 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78  Result,1,nPrefix
95f0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
9600: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
9610: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
9620: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
9630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9640: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9650: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
9660: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
9670: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9680: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
9690: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
96a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96b0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
96c0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
96d0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
96e0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
96f0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
9700: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9710: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
9720: 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78  rse, r1, nPrefix
9730: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72  Reg+1);.      br
9740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
9750: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9760: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
9770: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
9780: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
9790: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
97a0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
97b0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
97c0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
97d0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
97e0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
97f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
9800: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
9810: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
9820: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
9830: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
9840: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
9850: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
9860: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
9870: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
9880: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
9890: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
98a0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
98b0: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
98c0: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
98d0: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
98e0: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
98f0: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
9900: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
9910: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
9920: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
9930: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
9940: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
9950: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
9960: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
9970: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
9980: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
9990: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
99a0: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
99b0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
99c0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
99d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
99e0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
99f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9a00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
9a10: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d  est->zAffSdst)==
9a20: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20  nResultCol );.  
9a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9a40: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
9a50: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
9a60: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
9a70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31   .            r1
9a80: 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
9a90: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9ab0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
9ac0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
9ad0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
9ae0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
9af0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9b00: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9b10: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9b20: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
9b30: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
9b40: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
9b50: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
9b60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
9b80: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
9b90: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
9ba0: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
9bb0: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
9bc0: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
9bd0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
9be0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9bf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9c00: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
9c10: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
9c20: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
9c30: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
9c40: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
9c50: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
9c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
9c70: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
9c80: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
9c90: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
9ca0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
9cb0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
9cc0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
9cd0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
9ce0: 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20  ell or array of 
9cf0: 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  .    ** memory c
9d00: 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f  ells and break o
9d10: 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ut of the scan l
9d20: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
9d30: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
9d40: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
9d50: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9d60: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70  t( nResultCol<=p
9d70: 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20  Dest->nSdst );. 
9d80: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
9d90: 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20  orter(.         
9da0: 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74     pParse, pSort
9db0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
9dc0: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
9dd0: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
9de0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9df0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
9e00: 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74  ResultCol==pDest
9e10: 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20  ->nSdst );.     
9e20: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65     assert( regRe
9e30: 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20  sult==iParm );. 
9e40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
9e50: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
9e60: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
9e70: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
9e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9e90: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
9ea0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
9eb0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9ec0: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52   */..    case SR
9ed0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20  T_Coroutine:    
9ee0: 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20     /* Send data 
9ef0: 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  to a co-routine 
9f00: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9f10: 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20  Output: {       
9f20: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72   /* Return the r
9f30: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
9f40: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
9f50: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
9f60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
9f80: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
9f90: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
9fa0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
9fb0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
9fc0: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
9fd0: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
9fe0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
9ff0: 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69            nPrefi
a000: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
a010: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
a020: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
a030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a040: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
a050: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
a060: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
a070: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a080: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a090: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
a0a0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
a0b0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
a0c0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
a0d0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
a0e0: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
a0f0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a100: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a110: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
a120: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
a130: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
a140: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
a150: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
a160: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
a170: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
a180: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
a190: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
a1a0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
a1b0: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
a1c0: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
a1d0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
a1e0: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
a1f0: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
a200: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
a210: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
a220: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
a230: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
a240: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
a250: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
a260: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
a270: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
a280: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
a290: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
a2a0: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
a2b0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
a2c0: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
a2d0: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
a2e0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
a2f0: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
a300: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
a310: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
a320: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
a330: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
a340: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
a350: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
a360: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
a370: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
a380: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
a390: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a3a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
a3b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a3c0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
a3d0: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
a3e0: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
a3f0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
a400: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
a410: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
a420: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
a430: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
a440: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
a450: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
a460: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
a470: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
a480: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
a490: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
a4a0: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
a4b0: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
a4c0: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
a4d0: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
a4e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
a4f0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
a500: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
a540: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
a550: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a560: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
a570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a580: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
a590: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
a5a0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
a5b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
a5c0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
a5d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
a5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a5f0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a600: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
a610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a620: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
a630: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
a640: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
a650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
a660: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
a670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a680: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
a6b0: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
a6c0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
a6d0: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
a6f0: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
a700: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a710: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
a720: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
a730: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
a740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a750: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a760: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
a770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a780: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a790: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
a7a0: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
a7b0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
a7c0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
a7d0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a7e0: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
a7f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a800: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a810: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
a820: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
a830: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
a840: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
a850: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
a860: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
a870: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
a880: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a890: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
a8a0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
a8b0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
a8c0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
a8d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
a8e0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
a8f0: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
a900: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
a910: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
a920: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
a930: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
a940: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
a950: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
a960: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
a970: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
a980: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
a990: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
a9a0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
a9b0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
a9c0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
a9d0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
a9e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
a9f0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
aa00: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
aa10: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
aa20: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
aa30: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
aa40: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
aa50: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
aa60: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
aa70: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
aa80: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
aa90: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
aaa0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
aab0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
aac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aad0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
aae0: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
aaf0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
ab00: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ab10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
ab20: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
ab30: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
ab40: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
ab50: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
ab60: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
ab70: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
ab80: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
ab90: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
aba0: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
abb0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
abc0: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
abd0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
abe0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
abf0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
ac00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
ac10: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
ac20: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
ac30: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
ac40: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
ac50: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
ac60: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
ac70: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
ac80: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
ac90: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
aca0: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
acb0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
acc0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
acd0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
ace0: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
acf0: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
ad00: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
ad10: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
ad20: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
ad30: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
ad40: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
ad50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
ad60: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
ad70: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
ad80: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
ad90: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
ada0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
adb0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
adc0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
add0: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
ade0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
adf0: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
ae00: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
ae10: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
ae20: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
ae30: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
ae40: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ae50: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
ae60: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
ae70: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
ae80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
ae90: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
aea0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
aeb0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
aec0: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
aed0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
aee0: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
aef0: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
af00: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
af10: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
af20: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
af30: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
af40: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
af50: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
af60: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
af70: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
af80: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
af90: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
afa0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
afb0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
afc0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
afd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
afe0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
aff0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
b000: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
b010: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
b020: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
b030: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
b040: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
b050: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
b060: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
b070: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
b080: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
b090: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
b0a0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
b0b0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
b0c0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
b0d0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
b0e0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
b0f0: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
b100: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
b110: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
b120: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
b130: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
b140: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
b150: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
b160: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
b170: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
b180: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
b190: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
b1a0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
b1b0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
b1c0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
b1d0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
b1e0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
b1f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
b200: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
b210: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
b220: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
b230: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
b240: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
b250: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
b260: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
b270: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
b280: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b290: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
b2a0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
b2b0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
b2c0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
b2d0: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
b2e0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
b2f0: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
b300: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
b310: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
b320: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
b330: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
b340: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
b350: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
b360: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
b370: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
b380: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
b390: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
b3a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b3b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
b3c0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
b3d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
b3e0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
b3f0: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
b400: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
b410: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
b420: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
b430: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
b440: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
b450: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
b460: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
b470: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
b480: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
b490: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
b4a0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
b4b0: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
b4c0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
b4d0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
b4e0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
b4f0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
b500: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
b510: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
b520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
b530: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
b540: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
b550: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
b560: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
b570: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
b580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
b590: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
b5a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
b5b0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
b5c0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
b5d0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
b5e0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
b5f0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
b600: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
b610: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
b620: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
b630: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
b640: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
b650: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
b660: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
b670: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
b680: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
b690: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b6a0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
b6b0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
b6c0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
b6d0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
b6e0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
b6f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
b700: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
b710: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
b720: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
b730: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
b740: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
b750: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
b760: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
b770: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
b780: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
b790: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
b7a0: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
b7b0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
b7c0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
b7d0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
b7e0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
b7f0: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
b800: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
b810: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
b820: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
b830: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
b840: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 45  ar *zUsage){.  E
b850: 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
b860: 28 70 50 61 72 73 65 2c 20 30 2c 20 22 55 53 45  (pParse, 0, "USE
b870: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
b880: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 29 3b 0a   %s", zUsage));.
b890: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
b8a0: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
b8b0: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
b8c0: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
b8d0: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
b8e0: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
b8f0: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
b900: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
b910: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
b920: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
b930: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
b940: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
b950: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
b960: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
b970: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
b980: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
b990: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
b9a0: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
b9b0: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
b9c0: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
b9d0: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
b9e0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
b9f0: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
ba00: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
ba10: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
ba20: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
ba30: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
ba40: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
ba50: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
ba60: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
ba70: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
ba80: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
ba90: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ndif.../*.** If 
baa0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
bab0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
bac0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
bad0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
bae0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
baf0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
bb00: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
bb10: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
bb20: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
bb30: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
bb40: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
bb50: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
bb60: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
bb70: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
bb80: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
bb90: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
bba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bbb0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
bbc0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
bbd0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
bbe0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
bbf0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
bc00: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
bc10: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72  atement */.  Sor
bc20: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f  tCtx *pSort,   /
bc30: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  * Information on
bc40: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
bc50: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ause */.  int nC
bc60: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
bc70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
bc80: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
bc90: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
bca0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
bcb0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
bcc0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
bcd0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
bd00: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
bd10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
bd20: 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65  ak = pSort->labe
bd30: 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20  lDone;          
bd40: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
bd50: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
bd60: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
bd70: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
bd80: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
bd90: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
bda0: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
bdb0: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bdd0: 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70 75 74 20  * Top of output 
bde0: 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f 72 20 4e  loop. Jump for N
bdf0: 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ext. */.  int ad
be00: 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e  drOnce = 0;.  in
be10: 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69  t iTab;.  ExprLi
be20: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
be30: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Sort->pOrderBy;.
be40: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
be50: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
be60: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
be70: 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20  >iSDParm;.  int 
be80: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
be90: 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43  gRowid;.  int iC
bea0: 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20  ol;.  int nKey; 
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bed0: 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
bee0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
bef0: 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61  */.  int iSortTa
bf00: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
bf10: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
bf20: 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72  ursor to read fr
bf30: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  om */.  int i;. 
bf40: 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20   int bSeq;      
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74   /* True if sort
bf70: 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64  er record includ
bf80: 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20  es seq. no. */. 
bf90: 20 69 6e 74 20 6e 52 65 66 4b 65 79 20 3d 20 30   int nRefKey = 0
bfa0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
bfb0: 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78  ist_item *aOutEx
bfc0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b   = p->pEList->a;
bfd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ..  assert( addr
bfe0: 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28  Break<0 );.  if(
bff0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
c000: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
c010: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c020: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
c030: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
c040: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
c050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
c060: 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  to(v, addrBreak)
c070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c080: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c090: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
c0a0: 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ut);.  }..#ifdef
c0b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c0c0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
c0d0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 79 20 63  .  /* Open any c
c0e0: 75 72 73 6f 72 73 20 6e 65 65 64 65 64 20 66 6f  ursors needed fo
c0f0: 72 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  r sorter-referen
c100: 63 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  ce expressions *
c110: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
c120: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b  Sort->nDefer; i+
c130: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
c140: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Tab = pSort->aDe
c150: 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  fer[i].pTab;.   
c160: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
c170: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c180: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
c190: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c1a0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
c1b0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
c1c0: 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 2c 20  aDefer[i].iCsr, 
c1d0: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
c1e0: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 6e 52 65  enRead);.    nRe
c1f0: 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52 65 66 4b  fKey = MAX(nRefK
c200: 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  ey, pSort->aDefe
c210: 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a  r[i].nKey);.  }.
c220: 23 65 6e 64 69 66 0a 0a 20 20 69 54 61 62 20 3d  #endif..  iTab =
c230: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
c240: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
c250: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
c260: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
c270: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
c280: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  Mem ){.    regRo
c290: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
c2a0: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
c2b0: 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
c2c0: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
c2d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
c2e0: 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f  arse);.    regRo
c2f0: 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  w = sqlite3GetTe
c300: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
c310: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20  nColumn);.  }.  
c320: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
c330: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
c340: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
c350: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
c360: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
c370: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
c380: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
c390: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c3a0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
c3b0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
c3c0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
c3d0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
c3e0: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
c3f0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c400: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
c410: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
c420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c430: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
c440: 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c  seudo, iSortTab,
c450: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 0a 20 20   regSortOut, .  
c460: 20 20 20 20 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f        nKey+1+nCo
c470: 6c 75 6d 6e 2b 6e 52 65 66 4b 65 79 29 3b 0a 20  lumn+nRefKey);. 
c480: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
c490: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
c4a0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
c4b0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
c4c0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
c4d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
c4e0: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
c4f0: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
c500: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c510: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
c520: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
c530: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
c540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c550: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
c560: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
c570: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
c580: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
c590: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
c5a0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
c5b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
c5c0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
c5d0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
c5e0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
c5f0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
c600: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
c610: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
c620: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
c630: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
c640: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
c650: 62 53 65 71 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d  bSeq-1; i<nColum
c660: 6e 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20  n; i++){.#ifdef 
c670: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
c680: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
c690: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
c6a0: 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29 20 63  ].bSorterRef ) c
c6b0: 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a  ontinue;.#endif.
c6c0: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
c6d0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
c6e0: 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20  l==0 ) iCol++;. 
c6f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
c700: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
c710: 45 46 45 52 45 4e 43 45 53 0a 20 20 69 66 28 20  EFERENCES.  if( 
c720: 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 29 7b  pSort->nDefer ){
c730: 0a 20 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20  .    int iKey = 
c740: 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 69 6e 74 20  iCol+1;.    int 
c750: 72 65 67 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  regKey = sqlite3
c760: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
c770: 72 73 65 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 0a  rse, nRefKey);..
c780: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c790: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b  Sort->nDefer; i+
c7a0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
c7b0: 73 72 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66  sr = pSort->aDef
c7c0: 65 72 5b 69 5d 2e 69 43 73 72 3b 0a 20 20 20 20  er[i].iCsr;.    
c7d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c7e0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
c7f0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  .pTab;.      int
c800: 20 6e 4b 65 79 20 3d 20 70 53 6f 72 74 2d 3e 61   nKey = pSort->a
c810: 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a  Defer[i].nKey;..
c820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c830: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
c840: 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20  llRow, iCsr);.  
c850: 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
c860: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
c870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c880: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
c890: 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79  , iSortTab, iKey
c8a0: 2b 2b 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  ++, regKey);.   
c8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c8c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
c8d0: 6b 52 6f 77 69 64 2c 20 69 43 73 72 2c 20 0a 20  kRowid, iCsr, . 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c8f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
c900: 72 28 76 29 2b 31 2c 20 72 65 67 4b 65 79 29 3b  r(v)+1, regKey);
c910: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c920: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
c930: 20 20 20 20 20 69 6e 74 20 69 4a 6d 70 3b 0a 20       int iJmp;. 
c940: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
c950: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
c960: 49 6e 64 65 78 28 70 54 61 62 29 2d 3e 6e 4b 65  Index(pTab)->nKe
c970: 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  yCol==nKey );.  
c980: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
c990: 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  <nKey; k++){.   
c9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c9b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
c9c0: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
c9d0: 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 2b   iKey++, regKey+
c9e0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
c9f0: 20 20 20 20 20 20 69 4a 6d 70 20 3d 20 73 71 6c        iJmp = sql
ca00: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
ca10: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
ca20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ca30: 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47  4Int(v, OP_SeekG
ca40: 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b 32 2c  E, iCsr, iJmp+2,
ca50: 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a   regKey, nKey);.
ca60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ca70: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
ca80: 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c 20  OP_IdxLE, iCsr, 
ca90: 69 4a 6d 70 2b 33 2c 20 72 65 67 4b 65 79 2c 20  iJmp+3, regKey, 
caa0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73  nKey);.        s
cab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
cac0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
cad0: 69 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iCsr);.      }. 
cae0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
caf0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
cb00: 28 70 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c  (pParse, regKey,
cb10: 20 6e 52 65 66 4b 65 79 29 3b 0a 20 20 7d 0a 23   nRefKey);.  }.#
cb20: 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 6e 43  endif.  for(i=nC
cb30: 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69  olumn-1; i>=0; i
cb40: 2d 2d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  --){.#ifdef SQLI
cb50: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
cb60: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
cb70: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
cb80: 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20  orterRef ){.    
cb90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
cba0: 65 28 70 50 61 72 73 65 2c 20 61 4f 75 74 45 78  e(pParse, aOutEx
cbb0: 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65 67 52 6f  [i].pExpr, regRo
cbc0: 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  w+i);.    }else.
cbd0: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
cbe0: 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20     int iRead;.  
cbf0: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
cc00: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
cc10: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 65  l ){.        iRe
cc20: 61 64 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75  ad = aOutEx[i].u
cc30: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
cc40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cc50: 20 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 69         iRead = i
cc60: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Col--;.      }. 
cc70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cc80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
cc90: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
cca0: 52 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b  Read, regRow+i);
ccb0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
ccc0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75  nt((v, "%s", aOu
ccd0: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75  tEx[i].zName?aOu
cce0: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61  tEx[i].zName : a
ccf0: 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29  OutEx[i].zSpan))
cd00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77  ;.    }.  }.  sw
cd10: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
cd20: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
cd30: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
cd40: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
cd50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd60: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
cd70: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
cd80: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
cd90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cda0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
cdb0: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
cdc0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
cdd0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
cde0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
cdf0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ce00: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ce10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
ce20: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
ce30: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
ce40: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
ce50: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
ce60: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
ce70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ce80: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ce90: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
cea0: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
ceb0: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ced0: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
cee0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
cef0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
cf00: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
cf10: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e  Parse, regRow, n
cf20: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
cf30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
cf40: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
cf50: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
cf60: 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  owid, regRow, nC
cf70: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
cf80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
cf90: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
cfa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
cfb0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
cfc0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
cfd0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
cfe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
cff0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
d000: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
d010: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
d020: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
d030: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
d040: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d050: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
d060: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
d070: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
d080: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
d090: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
d0a0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
d0b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d0c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
d0d0: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
d0e0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
d0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d100: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
d110: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
d120: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
d130: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
d140: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
d150: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d160: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
d170: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
d180: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d1a0: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
d1b0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
d1c0: 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  et ){.      sqli
d1d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
d1e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
d1f0: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
d200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
d210: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d220: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
d230: 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Row);.    }.    
d240: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d250: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
d260: 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f  gRowid);.  }.  /
d270: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
d280: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
d290: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d2a0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
d2b0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
d2c0: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
d2d0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
d2e0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
d2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d300: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
d310: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
d320: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
d340: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d350: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
d360: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
d370: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
d380: 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  ( pSort->regRetu
d390: 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rn ) sqlite3Vdbe
d3a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
d3b0: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  urn, pSort->regR
d3c0: 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65  eturn);.  sqlite
d3d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d3e0: 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
d3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d400: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
d410: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
d420: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
d430: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
d440: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
d450: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
d460: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
d470: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
d480: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  caller..**.** Al
d490: 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  so try to estima
d4a0: 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
d4b0: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
d4c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  e and return tha
d4d0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a  t.** result in *
d4e0: 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a  pEstWidth..**.**
d4f0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
d500: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
d510: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
d520: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
d530: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
d540: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
d550: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
d560: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
d570: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
d580: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
d590: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
d5a0: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
d5b0: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
d5c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
d5d0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
d5e0: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
d5f0: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
d600: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
d610: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
d620: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
d630: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
d640: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
d650: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
d660: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
d670: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
d680: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
d690: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
d6a0: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
d6b0: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
d6c0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
d6d0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
d6e0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
d6f0: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
d700: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
d710: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
d720: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
d730: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
d740: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
d750: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
d760: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
d770: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
d780: 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70   either 3 or 6 p
d790: 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64  arameters depend
d7a0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
d7b0: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c  r not.** the SQL
d7c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
d7d0: 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69  N_METADATA compi
d7e0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
d7f0: 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  s used..*/.#ifde
d800: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d810: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
d820: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
d830: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63  ype(A,B,C,D,E) c
d840: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
d850: 42 2c 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f  B,C,D,E).#else /
d860: 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  * if !defined(SQ
d870: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
d880: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
d890: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
d8a0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63  ype(A,B,C,D,E) c
d8b0: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
d8c0: 42 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  B).#endif.static
d8d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
d8e0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
d8f0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
d900: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
d910: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d920: 45 54 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a  ETADATA.  Expr *
d930: 70 45 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78  pExpr.#else.  Ex
d940: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
d950: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
d960: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
d970: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
d980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
d990: 72 69 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b  rigCol.#endif.){
d9a0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
d9b0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
d9c0: 6a 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  j;.#ifdef SQLITE
d9d0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d9e0: 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63  ETADATA.  char c
d9f0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20  onst *zOrigDb = 
da00: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
da10: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
da20: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
da30: 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  igCol = 0;.#endi
da40: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f..  assert( pEx
da50: 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pr!=0 );.  asser
da60: 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
da70: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
da80: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
da90: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a  GG_COLUMN );  /*
daa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
dab0: 6e 65 73 20 62 65 66 6f 72 65 20 61 67 67 72 65  nes before aggre
dac0: 67 61 74 65 73 0a 20 20 20 20 20 20 20 20 20 20  gates.          
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
daf0: 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  are processed */
db00: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
db10: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
db20: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
db30: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
db40: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
db50: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
db60: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
db70: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
db80: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
db90: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
dba0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
dbb0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
dbc0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
dbd0: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
dbe0: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
dbf0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
dc00: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
dc10: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
dc20: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
dc30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
dc40: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
dc50: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
dc60: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
dc70: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
dc80: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
dc90: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
dca0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
dcb0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
dcc0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
dcd0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
dce0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
dcf0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
dd00: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
dd10: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
dd20: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
dd30: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
dd40: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
dd50: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
dd60: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
dd70: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
dd80: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
dd90: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
dda0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
ddb0: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
ddc0: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
ddd0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
dde0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
ddf0: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
de00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
de10: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
de20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
de30: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
de40: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
de50: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
de60: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
de70: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
de80: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
de90: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
dea0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
deb0: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
dec0: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
ded0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
dee0: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
def0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
df00: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
df10: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
df20: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
df30: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
df40: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
df50: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
df60: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
df70: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
df80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
df90: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
dfa0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
dfb0: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
dfc0: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
dfd0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
dfe0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
dff0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
e000: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
e010: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
e020: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
e030: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
e040: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
e050: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
e060: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
e070: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
e080: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
e090: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
e0a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
e0b0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
e0c0: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
e0d0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
e0e0: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
e0f0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
e100: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
e110: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
e120: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
e130: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
e140: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
e150: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
e160: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
e170: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
e180: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
e190: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
e1a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e1b0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
e1c0: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
e1d0: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
e1e0: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
e1f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
e200: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
e210: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
e220: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
e230: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
e240: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
e250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
e260: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
e270: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
e280: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
e290: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
e2a0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
e2b0: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
e2c0: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
e2d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
e2e0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e  >=0 && iCol<pS->
e2f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
e300: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
e310: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
e320: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
e330: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
e340: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
e350: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
e360: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
e370: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
e380: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
e390: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
e3a0: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
e3b0: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
e3c0: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
e3d0: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
e3e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
e3f0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
e400: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
e410: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
e420: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
e430: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
e440: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
e450: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
e460: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
e470: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
e480: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
e490: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
e4a0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
e4b0: 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26  NC, p,&zOrigDb,&
e4c0: 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43  zOrigTab,&zOrigC
e4d0: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
e4e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4f0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
e500: 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61  able or a CTE ta
e510: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
e520: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69  ssert( !pS );.#i
e530: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e540: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
e550: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
e560: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
e570: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
e580: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
e590: 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69  ==XN_ROWID || (i
e5a0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
e5b0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
e5c0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
e5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
e5e0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
e5f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
e600: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
e610: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e620: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
e630: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
e640: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
e650: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c       zType = sql
e660: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26  ite3ColumnType(&
e670: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
e680: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ,0);.        }. 
e690: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
e6a0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
e6b0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
e6c0: 70 50 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e  pParse && pTab->
e6d0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
e6e0: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
e6f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
e700: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
e710: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
e720: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
e730: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
e740: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
e750: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
e760: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
e770: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
e780: 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28  l==XN_ROWID || (
e790: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
e7a0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
e7b0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
e7c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
e7d0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
e7e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e7f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
e800: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
e810: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
e820: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
e830: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
e840: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e850: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
e860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
e870: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
e880: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
e890: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
e8a0: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
e8b0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
e8c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
e8d0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
e8e0: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
e8f0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
e900: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e910: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
e920: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
e930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e940: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
e950: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
e960: 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  pS = pExpr->x.pS
e970: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
e980: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
e990: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
e9a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
e9b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
e9c0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
e9d0: 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ) );.      sNC.p
e9e0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
e9f0: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
ea00: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
ea10: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
ea20: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
ea30: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
ea40: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
ea50: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
ea60: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  , &zOrigCol); . 
ea70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ea80: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
ea90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eaa0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
eab0: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
eac0: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
ead0: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
eae0: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
eaf0: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
eb00: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
eb10: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
eb20: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
eb30: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
eb40: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
eb50: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
eb60: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
eb70: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
eb80: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
eb90: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
eba0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
ebb0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
ebc0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
ebd0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
ebe0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ebf0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
ec00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
ec10: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
ec20: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
ec30: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
ec40: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
ec50: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
ec60: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
ec70: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
ec80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
ec90: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
eca0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ecb0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
ecc0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
ecd0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
ece0: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
ecf0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
ed00: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
ed10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
ed20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ed30: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
ed40: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
ed50: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
ed60: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
ed70: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ed80: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
ed90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
eda0: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
edb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
edc0: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
edd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
ede0: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
edf0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
ee00: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
ee10: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
ee20: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
ee30: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
ee40: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
ee50: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
ee60: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
ee70: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
ee80: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
ee90: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
eea0: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
eeb0: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
eec0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
eed0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
eee0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
eef0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ef00: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
ef10: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
ef20: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
ef30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ef40: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
ef50: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
ef60: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
ef70: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
ef80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ef90: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
efa0: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
efb0: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
efc0: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
efd0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
efe0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
eff0: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
f000: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f010: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
f020: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
f030: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
f040: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
f050: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
f060: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f070: 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a  DECLTYPE) */.}..
f080: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
f090: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f0a0: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
f0b0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
f0c0: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
f0d0: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
f0e0: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
f0f0: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
f100: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
f110: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
f120: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
f130: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
f140: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
f150: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
f160: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
f170: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
f180: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
f190: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
f1a0: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
f1b0: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
f1c0: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
f1d0: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
f1e0: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
f1f0: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
f200: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
f210: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
f220: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
f230: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
f240: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
f250: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
f260: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
f270: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73  *.** See Also: s
f280: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
f290: 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a  mExprList().**.*
f2a0: 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f  * The PRAGMA sho
f2b0: 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20  rt_column_names 
f2c0: 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f  and PRAGMA full_
f2d0: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74  column_names set
f2e0: 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70  tings are.** dep
f2f0: 72 65 63 61 74 65 64 2e 20 20 54 68 65 20 64 65  recated.  The de
f300: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73  fault setting is
f310: 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
f320: 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61  OFF.  99.9% of a
f330: 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ll.** applicatio
f340: 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74  ns should operat
f350: 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76  e this way.  Nev
f360: 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65  ertheless, we ne
f370: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68  ed to support th
f380: 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73  e.** other modes
f390: 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a   for legacy:.**.
f3a0: 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c  **    short=OFF,
f3b0: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
f3c0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74  Column name is t
f3d0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 65  he text of the e
f3e0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74  xpression has it
f3f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65   originally appe
f420: 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ars in the SELEC
f430: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  T statement.  In
f440: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
f470: 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72  e zSpan of the r
f480: 65 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e  esult expression
f490: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  ..**.**    short
f4a0: 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20  =ON, full=OFF:  
f4b0: 20 20 20 20 20 28 54 68 69 73 20 69 73 20 74 68       (This is th
f4c0: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
f4d0: 67 29 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  g).  If the resu
f4e0: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 72 65 66 65 72 73 20 64 69 72 65 63 74     refers direct
f510: 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f  ly to a table co
f520: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a  lumn, then the.*
f530: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
f550: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
f560: 65 20 69 73 20 6a 75 73 74 20 74 68 65 20 74 61  e is just the ta
f570: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20  ble column.**   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a             name:
f5a0: 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77   COLUMN.  Otherw
f5b0: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
f5c0: 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c  *.**    full=ON,
f5d0: 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20   short=ANY:     
f5e0: 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
f5f0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
f600: 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  to a table colum
f610: 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n,.**           
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75     then the resu
f640: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  lt column name w
f650: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
f660: 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  me.**           
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54     prefix, ex: T
f690: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74  ABLE.COLUMN.  Ot
f6a0: 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70 61  herwise use zSpa
f6b0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
f6c0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
f6d0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
f6e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
f6f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
f700: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
f710: 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ect     /* Gener
f720: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ate column names
f730: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
f740: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
f750: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
f760: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
f770: 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t i;.  Table *pT
f780: 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
f790: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
f7a0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
f7b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f7c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
f7d0: 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54  ullName;    /* T
f7e0: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
f7f0: 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
f800: 69 73 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  is a direct tabl
f810: 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73  e ref */.  int s
f820: 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43  rcName;     /* C
f830: 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43  OLUMN or TABLE.C
f840: 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63  OLUMN if no AS c
f850: 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64 69 72  lause and is dir
f860: 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ect */..#ifndef 
f870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
f880: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
f890: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
f8a0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
f8b0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
f8c0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
f8d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
f8e0: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
f8f0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
f900: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f910: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20   ) return;.  /* 
f920: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  Column names are
f930: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
f940: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
f950: 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  m of a compound 
f960: 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c  select */.  whil
f970: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
f980: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
f990: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
f9a0: 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
f9b0: 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c 28  pParse,pSelect,(
f9c0: 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c 75  "generating colu
f9d0: 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a 20  mn names\n"));. 
f9e0: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c   pTabList = pSel
f9f0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  ect->pSrc;.  pEL
fa00: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
fa10: 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
fa20: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
fa30: 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29  t( pTabList!=0 )
fa40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
fa50: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
fa60: 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  ullName = (db->f
fa70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
fa80: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
fa90: 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d    srcName = (db-
faa0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
fab0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
fac0: 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20  0 || fullName;. 
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
fae0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
faf0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
fb00: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
fb10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fb20: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
fb30: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20  ->a[i].pExpr;.. 
fb40: 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20     assert( p!=0 
fb50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
fb60: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
fb70: 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70  UMN );  /* Agg p
fb80: 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f  rocessing has no
fb90: 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20  t run yet */.   
fba0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
fbb0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
fbc0: 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f  pTab!=0 ); /* Co
fbd0: 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20 79  vering idx not y
fbe0: 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20  et coded */.    
fbf0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
fc00: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
fc10: 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65 20  /* An AS clause 
fc20: 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69 72  always takes fir
fc30: 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20  st priority */. 
fc40: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
fc50: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
fc60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
fc70: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fc80: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fc90: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
fca0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
fcb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
fcc0: 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d  rcName && p->op=
fcd0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
fce0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
fcf0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
fd00: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
fd10: 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54 61     pTab = p->pTa
fd20: 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
fd30: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
fd40: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
fd50: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
fd60: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
fd70: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
fd80: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
fd90: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
fda0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
fdb0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
fdc0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
fdd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
fde0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
fdf0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
fe00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66     }.      if( f
fe10: 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ullName ){.     
fe20: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
fe30: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
fe40: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
fe50: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
fe60: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
fe70: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
fe80: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fe90: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fea0: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
feb0: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
fec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fee0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fef0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
ff00: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
ff10: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
ff20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
ff30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
ff40: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
ff50: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
ff60: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
ff70: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
ff80: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
ff90: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
ffa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ffb0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ffc0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
ffd0: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
ffe0: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
fff0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
10000 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
10010 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
10020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
10030 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
10040 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  st (which is rea
10050 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lly the list of 
10060 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
10070 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73  hat form the res
10080 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
10090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63  ECT statement) c
100a0 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61  ompute appropria
100b0 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  te.** column nam
100c0 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  es for a table t
100d0 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  hat would hold t
100e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
100f0 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  st..**.** All co
10100 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20  lumn names will 
10110 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a  be unique..**.**
10120 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   Only the column
10130 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75   names are compu
10140 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79  ted.  Column.zTy
10150 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  pe, Column.zColl
10160 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  ,.** and other f
10170 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20  ields of Column 
10180 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
10190 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
101a0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
101b0 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
101c0 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
101d0 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55  urs,.** store NU
101e0 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64  LL in *paCol and
101f0 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64   0 in *pnCol and
10200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10210 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OMEM..**.** The 
10220 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
10230 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
10240 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10250 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
10260 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
10270 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
10280 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
10290 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
102a0 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
102b0 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
102c0 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
102d0 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
102e0 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
102f0 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
10300 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
10310 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
10320 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
10330 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
10340 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
10350 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
10360 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
10370 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
10380 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
10390 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
103a0 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
103b0 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
103c0 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
103d0 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e  ** See Also: gen
103e0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
103f0 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ().*/.int sqlite
10400 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
10410 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
10420 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
10430 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
10440 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
10450 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
10460 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
10470 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
10480 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
10490 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20  /.  i16 *pnCol, 
104a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
104b0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
104c0 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
104d0 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
104e0 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
104f0 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
10500 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
10510 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
10520 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10530 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10540 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
10550 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
10560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10570 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
10580 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20   u32 cnt;       
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105a0 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
105b0 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
105c0 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
105d0 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
105e0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
105f0 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
10600 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
10610 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
10620 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10630 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
10640 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10650 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
10660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10670 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
10680 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
106b0 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20   in zName[] */. 
106c0 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20 20   Hash ht;       
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106e0 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f  Hash table of co
106f0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20  lumn names */.. 
10700 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
10710 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c  (&ht);.  if( pEL
10720 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
10730 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
10740 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
10750 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
10760 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
10770 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
10780 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
10790 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c   );.    if( nCol
107a0 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d 20  >32767 ) nCol = 
107b0 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  32767;.  }else{.
107c0 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
107d0 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
107e0 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d    assert( nCol==
107f0 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a  (i16)nCol );.  *
10800 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
10810 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
10820 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
10830 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20  aCol; i<nCol && 
10840 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
10850 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  d; i++, pCol++){
10860 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
10870 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
10880 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
10890 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a     */.    if( (z
108a0 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
108b0 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
108c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
108d0 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
108e0 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
108f0 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
10900 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
10910 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
10920 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70     Expr *pColExp
10930 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
10940 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73  kipCollate(pELis
10950 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
10960 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
10970 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
10980 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
10990 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
109a0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
109b0 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
109c0 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
109d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
109e0 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ColExpr->op!=TK_
109f0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
10a00 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
10a10 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
10a20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
10a30 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
10a40 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
10a50 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
10a60 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
10a70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
10a80 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
10a90 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
10aa0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10ab0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
10ac0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
10ad0 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
10ae0 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
10af0 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  ame = iCol>=0 ? 
10b00 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
10b10 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
10b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10b30 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
10b40 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
10b50 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
10b60 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
10b70 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
10b80 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
10b90 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  e = pColExpr->u.
10ba0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
10bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
10bc0 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
10bd0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
10be0 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
10bf0 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
10c00 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
10c10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
10c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10c30 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
10c40 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
10c50 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
10c60 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
10c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  else{.      zNam
10c80 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
10c90 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22  tf(db,"column%d"
10ca0 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ,i+1);.    }..  
10cb0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
10cc0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
10cd0 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
10ce0 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
10cf0 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
10d00 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
10d10 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
10d20 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
10d30 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
10d40 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
10d50 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71  ile( zName && sq
10d60 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68  lite3HashFind(&h
10d70 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  t, zName)!=0 ){.
10d80 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
10d90 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
10da0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
10db0 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20  nName>0 ){.     
10dc0 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31     for(j=nName-1
10dd0 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ; j>0 && sqlite3
10de0 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d  Isdigit(zName[j]
10df0 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); j--){}.      
10e00 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d    if( zName[j]==
10e10 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b  ':' ) nName = j;
10e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
10e30 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
10e40 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a  rintf(db, "%.*z:
10e50 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  %u", nName, zNam
10e60 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
10e70 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c   if( cnt>3 ) sql
10e80 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
10e90 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e  sizeof(cnt), &cn
10ea0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  t);.    }.    pC
10eb0 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
10ec0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  e;.    sqlite3Co
10ed0 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
10ee0 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b  omName(0, pCol);
10ef0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  .    if( zName &
10f00 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  & sqlite3HashIns
10f10 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20  ert(&ht, zName, 
10f20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20  pCol)==pCol ){. 
10f30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
10f40 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ault(db);.    }.
10f50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
10f60 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69  hClear(&ht);.  i
10f70 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
10f80 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
10f90 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
10fa0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
10fb0 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
10fc0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
10fd0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10fe0 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
10ff0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
11000 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
11010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11020 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
11030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11040 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
11050 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
11060 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
11070 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
11080 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
11090 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
110a0 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
110b0 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
110c0 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
110d0 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
110e0 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
110f0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
11100 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
11110 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
11120 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
11130 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
11140 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
11150 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
11160 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
11170 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
11180 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
11190 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
111a0 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
111b0 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
111c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
111d0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
111e0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
111f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11200 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
11210 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
11220 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
11230 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
11240 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
11250 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
11260 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
11270 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
11280 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
11290 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
112a0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
112b0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
112c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
112d0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
112e0 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
112f0 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
11300 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
11310 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
11320 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11330 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *a;..  assert(
11340 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
11350 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
11360 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
11370 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
11380 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
11390 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e  >nCol==pSelect->
113a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
113b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
113c0 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
113d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
113e0 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
113f0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
11400 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
11410 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
11420 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
11430 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
11440 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
11450 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  pTab->aCol; i<pT
11460 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
11470 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  Col++){.    cons
11480 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
11490 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20     int n, m;.   
114a0 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b   p = a[i].pExpr;
114b0 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
114c0 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
114d0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f   0, 0, 0);.    /
114e0 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20  * pCol->szEst = 
114f0 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69  ... // Column si
11500 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43  ze est for SELEC
11510 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75  T tables never u
11520 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d  sed */.    pCol-
11530 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
11540 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
11550 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70  p);.    if( zTyp
11560 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73  e ){.      m = s
11570 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11580 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d  Type);.      n =
11590 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
115a0 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
115b0 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
115c0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
115d0 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43  locOrFree(db, pC
115e0 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32  ol->zName, n+m+2
115f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
11600 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  l->zName ){.    
11610 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c      memcpy(&pCol
11620 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54  ->zName[n+1], zT
11630 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20  ype, m+1);.     
11640 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
11650 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53  s |= COLFLAG_HAS
11660 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TYPE;.      }.  
11670 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c    }.    if( pCol
11680 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
11690 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
116a0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
116b0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
116c0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
116d0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
116e0 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
116f0 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  ol->zColl==0 ){.
11700 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
11710 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
11720 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
11730 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
11740 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
11750 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f  w = 1; /* Any no
11760 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72  n-zero value wor
11770 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ks */.}../*.** G
11780 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
11790 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
117a0 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
117b0 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
117c0 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
117d0 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
117e0 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
117f0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11800 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
11810 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
11820 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
11830 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
11840 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11850 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
11860 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
11870 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
11880 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
11890 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
118a0 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
118b0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
118c0 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
118d0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
118e0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
118f0 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
11900 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
11910 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
11920 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
11930 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
11940 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
11950 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
11960 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
11970 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
11980 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
11990 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
119a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
119b0 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65   0;.  }.  /* The
119c0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
119d0 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f  tOfSelect() is o
119e0 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65  nly used n conte
119f0 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73  xts where lookas
11a00 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ide.  ** is disa
11a10 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  bled */.  assert
11a20 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
11a30 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54  bDisable );.  pT
11a40 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
11a50 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
11a60 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
11a70 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
11a80 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
11a90 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
11aa0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ) );.  sqlite3Co
11ab0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
11ac0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
11ad0 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
11ae0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
11af0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Col);.  sqlite3S
11b00 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
11b10 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
11b20 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
11b30 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
11b40 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
11b50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11b60 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
11b70 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
11b80 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
11b90 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
11ba0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
11bb0 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
11bc0 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
11bd0 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
11be0 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
11bf0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
11c00 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11c10 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
11c20 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
11c30 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
11c40 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
11c50 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
11c60 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
11c70 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72  ->pVdbe ){.    r
11c80 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56  eturn pParse->pV
11c90 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dbe;.  }.  if( p
11ca0 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
11cb0 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  ==0.   && Optimi
11cc0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
11cd0 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f  arse->db,SQLITE_
11ce0 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a  FactorOutConst).
11cf0 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d    ){.    pParse-
11d00 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
11d10 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
11d20 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
11d30 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  te(pParse);.}...
11d40 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
11d50 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
11d60 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
11d70 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
11d80 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
11d90 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
11da0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
11db0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
11dc0 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
11dd0 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
11de0 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
11df0 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
11e00 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
11e10 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
11e20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
11e30 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
11e40 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
11e50 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
11e60 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
11e70 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
11e80 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
11e90 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
11ea0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
11eb0 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
11ec0 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
11ed0 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
11ee0 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
11ef0 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
11f00 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
11f10 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
11f20 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
11f30 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
11f40 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
11f50 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
11f60 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
11f70 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
11f80 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20  imit->pLeft and 
11f90 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20  pLimit->pRight. 
11fa0 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69   iLimit.** and i
11fb0 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
11fc0 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
11fd0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
11fe0 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
11ff0 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
12000 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
12010 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
12020 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
12030 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
12040 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
12050 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
12060 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
12070 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
12080 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
12090 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
120a0 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
120b0 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
120c0 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
120d0 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
120e0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d   pLimit->pLeft!=
120f0 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
12100 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
12110 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
12120 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
12130 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
12140 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
12150 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
12160 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
12170 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
12180 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
12190 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
121a0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
121b0 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
121c0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
121d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
121e0 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
121f0 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
12200 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
12210 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
12220 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  set;.  int n;.  
12230 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
12240 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28  ->pLimit;..  if(
12250 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
12260 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
12270 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
12280 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
12290 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
122a0 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
122b0 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
122c0 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
122d0 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
122e0 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
122f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
12300 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
12310 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
12320 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
12330 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12340 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
12350 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20   if( pLimit ){. 
12360 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69     assert( pLimi
12370 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20  t->op==TK_LIMIT 
12380 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12390 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20  Limit->pLeft!=0 
123a0 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  );.    p->iLimit
123b0 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
123c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
123d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
123e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
123f0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
12400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12410 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69  xprIsInteger(pLi
12420 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20  mit->pLeft, &n) 
12430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12450 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
12460 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
12470 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
12480 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
12490 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
124a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
124b0 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
124c0 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
124d0 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
124e0 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
124f0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
12500 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
12510 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
12520 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
12530 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
12540 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
12550 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
12560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12570 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12580 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74  e(pParse, pLimit
12590 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29  ->pLeft, iLimit)
125a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
125b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
125c0 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
125d0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
125e0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
125f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
12600 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
12610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12620 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
12630 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  t, iLimit, iBrea
12640 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
12650 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
12660 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  f( pLimit->pRigh
12670 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
12680 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
12690 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
126a0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
126b0 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
126c0 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
126d0 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
126e0 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
126f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12700 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74  e(pParse, pLimit
12710 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65  ->pRight, iOffse
12720 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12730 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12740 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
12750 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
12760 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
12770 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
12780 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
12790 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
127a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
127b0 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69  OffsetLimit, iLi
127c0 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20  mit, iOffset+1, 
127d0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
127e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
127f0 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
12800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
12810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12820 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
12830 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
12840 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
12850 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
12860 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
12870 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
12880 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
12890 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
128a0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
128b0 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
128c0 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
128d0 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
128e0 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
128f0 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
12900 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
12910 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
12920 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
12930 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
12940 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
12950 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
12960 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
12970 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
12980 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
12990 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
129a0 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
129b0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
129c0 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
129d0 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
129e0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
129f0 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
12a00 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
12a10 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
12a20 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
12a30 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
12a40 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
12a50 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75   );.  /* iCol mu
12a60 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  st be less than 
12a70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
12a80 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  .  Otherwise an 
12a90 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a  error would.  **
12aa0 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77   have been throw
12ab0 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65  n during name re
12ac0 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20  solution and we 
12ad0 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67  would not have g
12ae0 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  otten.  ** this 
12af0 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65  far */.  if( pRe
12b00 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  t==0 && ALWAYS(i
12b10 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
12b20 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65  Expr) ){.    pRe
12b30 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
12b40 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12b50 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
12b60 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
12b70 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
12b80 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
12b90 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
12ba0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
12bb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63  parameter is a c
12bc0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a  ompound SELECT.*
12bd0 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  * with an ORDER 
12be0 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20  BY clause. This 
12bf0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
12c00 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
12c10 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75   KeyInfo.** stru
12c20 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66  cture suitable f
12c30 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  or implementing 
12c40 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a  the ORDER BY..**
12c50 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
12c60 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
12c70 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
12c80 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
12c90 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
12ca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
12cb0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
12cc0 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  ring that this s
12cd0 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
12ce0 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
12cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
12d00 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f  fo *multiSelectO
12d10 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61  rderByKeyInfo(Pa
12d20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
12d30 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74  ect *p, int nExt
12d40 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ra){.  ExprList 
12d50 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
12d60 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e  OrderBy;.  int n
12d70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
12d80 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
12d90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
12da0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49  arse->db;.  KeyI
12db0 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  nfo *pRet = sqli
12dc0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
12dd0 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78  db, nOrderBy+nEx
12de0 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  tra, 1);.  if( p
12df0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
12e00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12e10 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
12e20 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
12e30 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
12e40 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e  em = &pOrderBy->
12e50 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72  a[i];.      Expr
12e60 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d   *pTerm = pItem-
12e70 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f  >pExpr;.      Co
12e80 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
12e90 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
12ea0 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
12eb0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  te ){.        pC
12ec0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
12ed0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
12ee0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
12ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
12f00 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
12f10 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
12f20 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69   p, pItem->u.x.i
12f30 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20  OrderByCol-1);. 
12f40 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
12f50 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  ==0 ) pColl = db
12f60 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
12f70 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
12f80 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20  [i].pExpr =.    
12f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12fa0 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
12fb0 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  g(pParse, pTerm,
12fc0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
12fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
12fe0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
12ff0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
13000 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70  pRet) );.      p
13010 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Ret->aColl[i] = 
13020 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65  pColl;.      pRe
13030 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  t->aSortOrder[i]
13040 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
13050 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
13060 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
13070 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
13080 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
13090 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
130a0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56  tine generates V
130b0 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  DBE code to comp
130c0 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ute the content 
130d0 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53  of a WITH RECURS
130e0 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20  IVE.** query of 
130f0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
13100 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62    <recursive-tab
13110 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71  le> AS (<setup-q
13120 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c  uery> UNION [ALL
13130 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65  ] <recursive-que
13140 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ry>).**         
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  \___________/   
13170 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
13180 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69           p->pPri
131b0 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
131c0 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a          p.**.**.
131d0 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63  ** There is exac
131e0 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  tly one referenc
131f0 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69  e to the recursi
13200 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ve-table in the 
13210 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f  FROM clause.** o
13220 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  f recursive-quer
13230 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74  y, marked with t
13240 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e  he SrcList->a[].
13250 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 66  fg.isRecursive f
13260 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  lag..**.** The s
13270 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20  etup-query runs 
13280 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65  once to generate
13290 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20   an initial set 
132a0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a  of rows that go.
132b0 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20  ** into a Queue 
132c0 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65  table.  Rows are
132d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
132e0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
132f0 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20  one by.** one.  
13300 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74  Each row extract
13310 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73  ed from Queue is
13320 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
13330 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67  .  Then the sing
13340 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  le.** extracted 
13350 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20  row (now in the 
13360 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20  iCurrent table) 
13370 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74  becomes the cont
13380 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  ent of the.** re
13390 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f  cursive-table fo
133a0 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75  r a recursive-qu
133b0 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75  ery run.  The ou
133c0 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75  tput of the recu
133d0 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69  rsive-query.** i
133e0 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74  s added back int
133f0 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
13400 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72  e.  Then another
13410 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65   row is extracte
13420 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20  d from Queue.** 
13430 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f  and the iteratio
13440 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69  n continues unti
13450 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  l the Queue tabl
13460 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
13470 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  * If the compoun
13480 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72  d query operator
13490 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e   is UNION then n
134a0 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73  o duplicate rows
134b0 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73   are ever.** ins
134c0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51  erted into the Q
134d0 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
134e0 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65   iDistinct table
134f0 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66   keeps a copy of
13500 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61   all rows.** tha
13510 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e  t have ever been
13520 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51   inserted into Q
13530 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20  ueue and causes 
13540 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65  duplicates to be
13550 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20  .** discarded.  
13560 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  If the operator 
13570 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68  is UNION ALL, th
13580 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72  en duplicates ar
13590 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a  e allowed..** .*
135a0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68  * If the query h
135b0 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  as an ORDER BY, 
135c0 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20  then entries in 
135d0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
135e0 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f  are kept in.** O
135f0 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e  RDER BY order an
13600 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  d the first entr
13610 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  y is extracted f
13620 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20  or each cycle.  
13630 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52  Without.** an OR
13640 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75  DER BY, the Queu
13650 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20  e table is just 
13660 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66  a FIFO..**.** If
13670 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
13680 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65  is provided, the
13690 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  n the iteration 
136a0 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49  stops after LIMI
136b0 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62  T rows.** have b
136c0 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44  een output to pD
136d0 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66  est.  A LIMIT of
136e0 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f   zero means to o
136f0 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e  utput no rows an
13700 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20  d a.** negative 
13710 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f  LIMIT means to o
13720 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20  utput all rows. 
13730 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73   If there is als
13740 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  o an OFFSET clau
13750 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73  se.** with a pos
13760 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65  itive value, the
13770 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  n the first OFFS
13780 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64  ET outputs are d
13790 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a  iscarded rather.
137a0 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65  ** than being se
137b0 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  nt to pDest.  Th
137c0 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f  e LIMIT count do
137d0 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74  es not begin unt
137e0 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a  il after OFFSET.
137f0 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65  ** rows have bee
13800 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  n skipped..*/.st
13810 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
13820 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
13830 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
13840 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13850 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13860 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13880 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
13890 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ECT to be coded 
138a0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
138b0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
138c0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
138d0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
138e0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
138f0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20  c = p->pSrc;    
13900 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
13910 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75  ause of the recu
13920 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
13930 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70   int nCol = p->p
13940 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f  EList->nExpr;  /
13950 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
13960 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72  mns in the recur
13970 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  sive table */.  
13980 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13990 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
139a0 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
139b0 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
139c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
139d0 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d  Select *pSetup =
139e0 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a   p->pPrior;   /*
139f0 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79   The setup query
13a00 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
13a10 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13a20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
13a30 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
13a40 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
13a50 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e  eak;      /* CON
13a60 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20  TINUE and BREAK 
13a70 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69  addresses */.  i
13a80 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b  nt iCurrent = 0;
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13aa0 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  The Current tabl
13ab0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75  e */.  int regCu
13ac0 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rrent;          
13ad0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13ae0 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74   holding Current
13af0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
13b00 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20  iQueue;         
13b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13b20 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a   Queue table */.
13b30 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20    int iDistinct 
13b40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13b50 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69  /* To ensure uni
13b60 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55  que results if U
13b70 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  NION */.  int eD
13b80 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20  est = SRT_Fifo; 
13b90 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
13ba0 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65  o write to Queue
13bb0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
13bc0 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20   destQueue;     
13bd0 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73      /* SelectDes
13be0 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65  t targetting the
13bf0 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a   Queue table */.
13c00 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
13c30 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
13c60 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
13c70 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
13c80 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
13c90 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
13ca0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20   Expr *pLimit;  
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13cc0 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e  * Saved LIMIT an
13cd0 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e  d OFFSET */.  in
13ce0 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f  t regLimit, regO
13cf0 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52  ffset;      /* R
13d00 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79  egisters used by
13d10 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
13d20 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  T */..  /* Obtai
13d30 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
13d40 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76  to do a recursiv
13d50 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  e query */.  if(
13d60 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13d70 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
13d80 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30  _RECURSIVE, 0, 0
13d90 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
13da0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
13db0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
13dc0 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68  T clauses, if th
13dd0 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64  ey exist */.  ad
13de0 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  drBreak = sqlite
13df0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13e00 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
13e10 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
13e20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
13e30 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
13e40 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
13e50 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  p, addrBreak);. 
13e60 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
13e70 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  mit;.  regLimit 
13e80 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
13e90 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
13ea0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
13eb0 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  it = 0;.  p->iLi
13ec0 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
13ed0 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
13ee0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
13ef0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
13f00 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
13f10 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
13f20 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
13f30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
13f40 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
13f50 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
13f60 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
13f70 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
13f80 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
13f90 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
13fa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
13fb0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
13fc0 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
13fd0 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
13fe0 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
13ff0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
14000 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
14010 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
14020 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
14030 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
14040 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
14050 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
14060 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
14070 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
14080 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
14090 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
140a0 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
140b0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
140c0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
140d0 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
140e0 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
140f0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
14100 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14110 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
14120 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
14130 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
14140 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
14150 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14160 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
14170 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
14180 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14190 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
141a0 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
141b0 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
141c0 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
141d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
141e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
141f0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
14200 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
14210 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
14220 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
14230 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
14240 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
14250 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
14260 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
14270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14280 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
14290 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
142a0 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
142b0 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
142e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
142f0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
14300 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
14310 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14330 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14340 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
14350 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
14360 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
14370 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
14380 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
14390 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
143a0 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
143b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
143c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
143d0 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
143e0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
143f0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
14400 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
14410 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
14420 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
14430 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
14440 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
14450 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
14460 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
14470 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
14480 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
14490 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
144a0 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65   0;.  ExplainQue
144b0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
144c0 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20 20  1, "SETUP"));.  
144d0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
144e0 53 65 74 49 64 28 70 50 61 72 73 65 2c 20 70 53  SetId(pParse, pS
144f0 65 74 75 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  etup);.  rc = sq
14500 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14510 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
14520 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
14530 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
14540 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
14550 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
14560 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
14570 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
14580 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
14590 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
145a0 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
145b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
145c0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
145d0 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
145e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
145f0 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
14600 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
14610 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
14620 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
14630 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14640 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
14650 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
14660 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
14670 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
14680 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
14690 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
146a0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
146b0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
146c0 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
146d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
146e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
146f0 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
14700 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
14710 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
14720 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14730 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
14740 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
14750 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
14760 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
14770 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
14780 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14790 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
147a0 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
147b0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
147c0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
147d0 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
147e0 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
147f0 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
14800 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
14810 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
14820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14830 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
14840 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
14850 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
14860 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14870 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
14880 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
14890 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
148a0 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
148b0 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
148c0 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
148d0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
148e0 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
148f0 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
14900 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
14910 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
14920 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
14930 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
14940 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
14950 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
14960 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14970 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
14980 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
14990 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
149a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
149b0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
149c0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
149d0 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45  ((pParse, 1, "RE
149e0 43 55 52 53 49 56 45 20 53 54 45 50 22 29 29 3b  CURSIVE STEP"));
149f0 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72  .    ExplainQuer
14a00 79 50 6c 61 6e 53 65 74 49 64 28 70 50 61 72 73  yPlanSetId(pPars
14a10 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, p);.    sqlit
14a20 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14a30 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
14a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14a50 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
14a60 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
14a70 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b  tup;.  }..  /* K
14a80 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  eep running the 
14a90 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51  loop until the Q
14aa0 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f  ueue is empty */
14ab0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
14ac0 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  to(v, addrTop);.
14ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14ae0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
14af0 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
14b00 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
14b10 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
14b20 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
14b30 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
14b40 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42  y);.  p->pOrderB
14b50 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
14b60 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
14b70 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  it;.  return;.}.
14b80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14b90 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a  _OMIT_CTE */../*
14ba0 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14bb0 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces */.static in
14bc0 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
14bd0 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
14be0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
14bf0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14c00 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
14c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14c20 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
14c30 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
14c40 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
14c50 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
14c60 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
14c70 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
14c80 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.);../*.** Ha
14c90 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c  ndle the special
14ca0 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f   case of a compo
14cb0 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
14cc0 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
14cd0 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75  a.** VALUES clau
14ce0 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67  se.  By handling
14cf0 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
14d00 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69  al case, we avoi
14d10 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73  d deep.** recurs
14d20 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f  ion, and thus do
14d30 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66   not need to enf
14d40 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f  orce the SQLITE_
14d50 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
14d60 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41  ELECT.** on a VA
14d70 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  LUES clause..**.
14d80 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53  ** Because the S
14d90 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69  elect object ori
14da0 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56  ginates from a V
14db0 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a  ALUES clause:.**
14dc0 20 20 20 28 31 29 20 54 68 65 72 65 20 69 73 20     (1) There is 
14dd0 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
14de0 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65 72 65  ET or else there
14df0 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66 20 65   is a LIMIT of e
14e00 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20 28 32  xactly 1.**   (2
14e10 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  ) All terms are 
14e20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28  UNION ALL.**   (
14e30 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f  3) There is no O
14e40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
14e50 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49 54 20  *.** The "LIMIT 
14e60 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20 63 61  of exactly 1" ca
14e70 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 20  se of condition 
14e80 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  (1) comes about 
14e90 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a 2a 2a  when a VALUES.**
14ea0 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73 20 77   clause occurs w
14eb0 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65 78 70  ithin scalar exp
14ec0 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22 53 45  ression (ex: "SE
14ed0 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31 29 2c  LECT (VALUES(1),
14ee0 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a 20 54  (2),(3))")..** T
14ef0 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  he sqlite3CodeSu
14f00 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68 61 76  bselect will hav
14f10 65 20 61 64 64 65 64 20 74 68 65 20 4c 49 4d 49  e added the LIMI
14f20 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20 74 68  T 1 clause in th
14f30 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e 63 65  t case..** Since
14f40 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20 65 78   the limit is ex
14f50 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e 6c 79  actly 1, we only
14f60 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75 74 65   need to evalute
14f70 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
14f80 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61 74 69  VALUES..*/.stati
14f90 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
14fa0 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
14fb0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14fc0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
14fd0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
14fe0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
14ff0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
15000 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
15010 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
15020 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
15030 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
15040 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
15050 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
15060 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 53 65  ct *pPrior;.  Se
15070 6c 65 63 74 20 2a 70 52 69 67 68 74 6d 6f 73 74  lect *pRightmost
15080 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e 52 6f 77   = p;.  int nRow
15090 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 1;.  int rc =
150a0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
150b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
150c0 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64  ultiValue );.  d
150d0 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
150e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
150f0 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73  Values );.    as
15100 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
15110 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54  ALL || (p->op==T
15120 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70  K_SELECT && p->p
15130 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20  Prior==0) );.   
15140 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
15150 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  t==0 || p->pELis
15160 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65  t->nExpr==p->pNe
15170 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  xt->pEList->nExp
15180 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r );.    if( p->
15190 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
151a0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
151b0 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
151c0 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
151d0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
151e0 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
151f0 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
15200 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
15210 20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41   "SCAN %d CONSTA
15220 4e 54 20 52 4f 57 53 22 2c 20 6e 52 6f 77 29 29  NT ROWS", nRow))
15230 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
15240 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
15250 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
15260 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
15270 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15280 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
15290 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
152a0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
152b0 20 69 66 28 20 72 63 20 7c 7c 20 70 52 69 67 68   if( rc || pRigh
152c0 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69 74 20 29 20  tmost->pLimit ) 
152d0 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53  break;.    p->nS
152e0 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b  electRow = nRow;
152f0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
15300 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
15310 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
15320 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15330 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
15340 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
15350 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
15360 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
15370 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
15380 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
15390 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
153a0 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
153b0 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
153c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
153d0 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
153e0 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
153f0 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
15400 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
15410 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
15420 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
15430 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
15440 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
15450 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
15460 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
15470 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
15480 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
15490 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
154a0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
154b0 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
154c0 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
154d0 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
154e0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
154f0 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
15500 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
15510 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
15520 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
15530 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
15540 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
15550 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
15560 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
15570 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
15580 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
15590 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
155a0 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
155b0 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
155c0 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
155d0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
155e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
155f0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
15600 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
15610 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
15620 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
15630 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
15640 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
15650 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
15660 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
15670 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
15680 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
15690 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
156a0 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
156b0 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
156c0 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
156d0 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
156e0 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
156f0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
15700 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
15710 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
15720 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
15730 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
15740 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
15750 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
15760 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
15770 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
15780 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
15790 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
157a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
157b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
157c0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
157d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
157e0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
157f0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
15800 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15810 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
15820 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
15830 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
15840 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15850 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
15860 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
15870 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
15880 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
15890 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
158a0 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
158b0 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
158c0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
158d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
158e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
158f0 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
15900 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
15910 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
15920 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
15930 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
15940 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
15950 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
15960 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
15970 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
15980 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
15990 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
159a0 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ection */..  /* 
159b0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
159c0 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
159d0 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
159e0 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
159f0 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
15a00 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
15a10 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
15a20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
15a30 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
15a40 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  IMIT..  */.  ass
15a50 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72  ert( p && p->pPr
15a60 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69  ior );  /* Calli
15a70 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72  ng function guar
15a80 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68  antees this much
15a90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
15aa0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
15ab0 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c  Recursive)==0 ||
15ac0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
15ad0 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  | p->op==TK_UNIO
15ae0 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  N );.  db = pPar
15af0 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
15b00 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15b10 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
15b20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
15b30 64 65 72 42 79 20 7c 7c 20 70 50 72 69 6f 72 2d  derBy || pPrior-
15b40 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
15b50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15b60 50 61 72 73 65 2c 22 25 73 20 63 6c 61 75 73 65  Parse,"%s clause
15b70 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
15b80 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
15b90 22 2c 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  ",.      pPrior-
15ba0 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 3f 20 22  >pOrderBy!=0 ? "
15bb0 4f 52 44 45 52 20 42 59 22 20 3a 20 22 4c 49 4d  ORDER BY" : "LIM
15bc0 49 54 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  IT", selectOpNam
15bd0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
15be0 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
15bf0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15c00 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
15c10 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15c20 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
15c30 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
15c40 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
15c50 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
15c60 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
15c70 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
15c80 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
15c90 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
15ca0 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
15cb0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
15cc0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
15cd0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15ce0 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
15cf0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15d00 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
15d10 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
15d20 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
15d30 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
15d40 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
15d50 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68  ..  /* Special h
15d60 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f  andling for a co
15d70 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
15d80 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73  at originates as
15d90 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
15da0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15db0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
15dc0 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ltiValue ){.    
15dd0 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
15de0 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
15df0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
15e00 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
15e10 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
15e20 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
15e30 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
15e40 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
15e50 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
15e60 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
15e70 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
15e80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15e90 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
15ea0 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
15eb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
15ec0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69  ist->nExpr==pPri
15ed0 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
15ee0 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  r );..#ifndef SQ
15ef0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
15f00 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
15f10 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
15f20 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
15f30 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
15f40 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
15f50 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
15f60 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
15f70 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
15f80 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
15f90 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
15fa0 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
15fb0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
15fc0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
15fd0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
15fe0 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
15ff0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
16000 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e{..#ifndef SQLI
16010 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
16020 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
16030 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
16040 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
16050 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f  Parse, 1, "COMPO
16060 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20 20  UND QUERY"));.  
16070 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 72 69    }.    if( pPri
16080 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
16090 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
160a0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
160b0 20 31 2c 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53   1, "LEFT-MOST S
160c0 55 42 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20  UBQUERY"));.    
160d0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
160e0 61 6e 53 65 74 49 64 28 70 50 61 72 73 65 2c 20  anSetId(pParse, 
160f0 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 7d 0a 23  pPrior);.    }.#
16100 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65  endif..    /* Ge
16110 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
16120 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
16130 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
16140 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
16150 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
16160 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  {.      case TK_
16170 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ALL: {.        i
16180 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
16190 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
161a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
161b0 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
161c0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
161d0 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->iLimit = p->
161e0 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
161f0 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20  pPrior->iOffset 
16200 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
16210 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
16220 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
16230 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
16240 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
16250 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
16260 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  st);.        p->
16270 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
16280 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
16290 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
162a0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
162b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
162c0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
162d0 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
162e0 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
162f0 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  it;.        p->i
16300 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
16310 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
16320 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
16330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
16340 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16350 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
16360 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  t, p->iLimit); V
16370 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16380 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
16390 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
163a0 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
163b0 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
163c0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66       if( p->iOff
163d0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
163e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163f0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
16400 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  tLimit,.        
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c        p->iLimit,
16430 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70   p->iOffset+1, p
16440 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->iOffset);.    
16450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16460 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69  }.        Explai
16470 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
16480 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c  se, 1, "UNION AL
16490 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20 45 78  L"));.        Ex
164a0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 53 65  plainQueryPlanSe
164b0 74 49 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  tId(pParse, p);.
164c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
164d0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
164e0 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
164f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16500 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
16510 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65  .        pDelete
16520 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
16530 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
16540 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
16550 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
16560 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
16570 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
16580 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
16590 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69  tRow);.        i
165a0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
165b0 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  t.         && sq
165c0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
165d0 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
165e0 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69  t->pLeft, &nLimi
165f0 74 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  t).         && n
16600 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
16610 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74  electRow > sqlit
16620 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
16630 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29  imit) .        )
16640 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  {.          p->n
16650 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
16660 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
16670 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
16680 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  }.        if( ad
16690 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
166a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
166b0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
166c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
166d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
166e0 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
166f0 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EPT:.      case 
16700 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
16710 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
16720 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
16730 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
16740 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  p table holding 
16750 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
16760 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
16770 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
16780 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
16790 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
167a0 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  f */.        int
167b0 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
167c0 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
167d0 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
167e0 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
167f0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
16800 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76  Limit;    /* Sav
16810 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
16820 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20  nLimit  */.     
16830 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
16840 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
16850 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20  uniondest;.  .  
16860 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16870 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
16880 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
16890 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
168a0 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
168b0 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
168c0 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  nion;.        if
168d0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
168e0 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
168f0 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
16900 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
16910 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
16920 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
16930 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  r.          ** r
16940 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ight..          
16950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
16960 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
16970 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
16980 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
16990 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
169a0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  .          union
169b0 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
169c0 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rm;.        }els
169d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
169e0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
169f0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
16a00 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
16a10 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
16a20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
16a30 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
16a40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16a50 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
16a60 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
16a70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16a80 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
16a90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64   );.          ad
16aa0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16ab0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
16ac0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
16ad0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
16ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
16af0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
16b00 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
16b10 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
16b20 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
16b30 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
16b40 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
16b50 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
16b60 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  meral;.         
16b70 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
16b80 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  st );.        }.
16b90 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
16ba0 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
16bb0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
16bc0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a  left.        */.
16bd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16be0 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
16bf0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
16c00 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
16c10 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
16c20 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
16c30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
16c40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16c50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
16c60 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
16c70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16c80 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
16c90 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
16ca0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
16cb0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
16cc0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
16cd0 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
16ce0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
16cf0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
16d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20  ){.          op 
16d10 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
16d20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16d30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16d40 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
16d50 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  ;.          op =
16d60 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
16d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
16d80 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
16d90 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
16da0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
16db0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
16dc0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73          uniondes
16dd0 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
16de0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
16df0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
16e00 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
16e10 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e30 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
16e40 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
16e50 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
16e60 50 6c 61 6e 53 65 74 49 64 28 70 50 61 72 73 65  PlanSetId(pParse
16e70 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , p);.        rc
16e80 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
16e90 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
16ea0 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20  ondest);.       
16eb0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
16ec0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
16ed0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
16ee0 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
16ef0 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
16f00 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
16f10 72 42 79 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  rBy..        ** 
16f20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
16f30 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
16f40 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
16f50 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
16f60 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
16f70 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
16f80 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
16f90 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  By);.        pDe
16fa0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
16fb0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
16fc0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
16fd0 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
16fe0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  y = 0;.        i
16ff0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
17000 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ON ){.          
17010 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
17020 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
17030 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
17040 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
17050 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ow);.        }. 
17060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17070 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
17080 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  pLimit);.       
17090 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
170a0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
170b0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
170c0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
170d0 20 30 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f   0;.  .        /
170e0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
170f0 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
17100 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
17110 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
17120 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
17130 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
17140 6e 65 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  need..        */
17150 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17160 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e   unionTab==dest.
17170 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e  iSDParm || dest.
17180 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
17190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
171a0 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
171b0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
171c0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
171d0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
171e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
171f0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
17200 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
17210 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17220 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (v);.          i
17230 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
17240 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17250 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74            comput
17260 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
17270 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
17280 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  k);.          sq
17290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
172a0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
172b0 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
172c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
172d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ;.          iSta
172e0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
172f0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
17300 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
17310 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
17320 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20  , p, unionTab,. 
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
17350 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
17360 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
17370 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17380 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
17390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
173a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
173b0 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
173c0 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64  Tab, iStart); Vd
173d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
173e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
173f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17400 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
17410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17420 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
17430 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
17440 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
17450 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17460 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
17470 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  lt: assert( p->o
17480 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
17490 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ); {.        int
174a0 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
174b0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
174c0 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
174d0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
174e0 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 6e  imit;.        in
174f0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  t addr;.        
17500 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
17510 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
17520 20 20 69 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20    int r1;.  .   
17530 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
17540 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
17550 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
17560 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
17570 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  .        ** two 
17580 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
17590 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
175a0 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
175b0 65 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  egin.        ** 
175c0 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
175d0 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
175e0 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 20 20 2a   need..        *
175f0 2f 0a 20 20 20 20 20 20 20 20 74 61 62 31 20 3d  /.        tab1 =
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 74 61 62 32 20 3d 20  .        tab2 = 
17620 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
17630 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17640 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
17650 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 61 64 64  ;.  .        add
17660 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17670 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17680 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
17690 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
176a0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
176b0 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
176c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
176d0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
176e0 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64  dr;.        find
176f0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
17700 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
17710 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
17720 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17730 45 4c 69 73 74 20 29 3b 0a 20 20 0a 20 20 20 20  EList );.  .    
17740 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
17750 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
17760 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
17770 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
17780 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17790 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
177a0 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
177b0 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
177c0 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
177d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
177e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
177f0 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
17800 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tdest);.        
17810 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
17820 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
17830 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
17840 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
17850 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
17860 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
17870 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17880 22 74 61 62 32 22 0a 20 20 20 20 20 20 20 20 2a  "tab2".        *
17890 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  /.        addr =
178a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
178b0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
178c0 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
178d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
178e0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
178f0 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
17900 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
17910 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
17920 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
17930 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
17940 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
17950 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  it;.        p->p
17960 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
17970 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
17980 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
17990 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
179a0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
179b0 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20  e, 1, "%s USING 
179c0 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20  TEMP B-TREE",.  
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70          selectOp
179f0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20  Name(p->op)));. 
17a00 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
17a10 65 72 79 50 6c 61 6e 53 65 74 49 64 28 70 50 61  eryPlanSetId(pPa
17a20 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  rse, p);.       
17a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
17a40 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
17a50 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
17a60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17a80 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65  );.        pDele
17a90 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
17aa0 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
17ab0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
17ac0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
17ad0 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53  ctRow>pPrior->nS
17ae0 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
17af0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
17b00 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
17b10 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
17b20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17b30 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
17b40 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
17b50 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
17b60 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a 20 20 20  = pLimit;.  .   
17b70 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
17b80 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
17b90 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
17ba0 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
17bb0 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
17bc0 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
17bd0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
17be0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
17bf0 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
17c00 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17c10 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
17c20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
17c30 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17c40 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
17c50 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
17c60 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
17c70 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
17c80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17c90 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
17ca0 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
17cb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17cc0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17cd0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
17ce0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  e);.        iSta
17cf0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
17d00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
17d10 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b  Data, tab1, r1);
17d20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17d30 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
17d40 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
17d50 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
17d60 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
17d70 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17d80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17d90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17da0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
17db0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
17dc0 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a  Parse, p, tab1,.
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
17df0 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
17e00 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
17e10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17e20 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
17e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17e40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17e50 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
17e60 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  rt); VdbeCoverag
17e70 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
17e80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17e90 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
17ea0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17eb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17ec0 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
17ed0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17ee0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17ef0 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
17f00 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
17f10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
17f20 0a 20 20 0a 20 20 23 69 66 6e 64 65 66 20 53 51  .  .  #ifndef SQ
17f30 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
17f40 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  N.    if( p->pNe
17f50 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  xt==0 ){.      E
17f60 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
17f70 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
17f80 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20  }.  #endif.  }. 
17f90 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63   .  /* Compute c
17fa0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
17fb0 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
17fc0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17fd0 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
17fe0 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
17ff0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
18000 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
18010 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
18020 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
18030 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
18040 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
18050 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
18060 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
18070 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
18080 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
18090 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
180a0 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
180b0 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
180c0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
180d0 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
180e0 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
180f0 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
18100 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
18110 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
18120 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
18130 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
18140 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
18150 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
18160 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18180 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
18190 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
181a0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
181b0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
181c0 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
181d0 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
181e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
181f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
18200 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
18210 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
18220 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
18230 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
18240 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
18250 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
18260 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
18270 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
18280 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
182a0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
182b0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
182c0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
182d0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
182e0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
182f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
18300 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
18310 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
18320 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  db, nCol, 1);.  
18330 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
18340 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
18350 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
18360 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
18370 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
18380 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c    }.    for(i=0,
18390 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
183a0 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
183b0 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
183c0 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
183d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
183e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
183f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
18400 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
18410 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d     *apColl = db-
18420 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
18430 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
18440 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
18450 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
18460 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66  pPrior){.      f
18470 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
18480 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
18490 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64  ddr = pLoop->add
184a0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20  rOpenEphm[i];.  
184b0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30        if( addr<0
184c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
184d0 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65   If [0] is unuse
184e0 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c  d then [1] is al
184f0 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77  so unused.  So w
18500 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20  e can.          
18510 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79  ** always safely
18520 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61   abort as soon a
18530 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73  s the first unus
18540 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64  ed slot is found
18550 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
18560 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64  sert( pLoop->add
18570 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29  rOpenEphm[1]<0 )
18580 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
18590 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
185a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
185b0 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
185c0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
185d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
185e0 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63  geP4(v, addr, (c
185f0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
18600 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
18610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
18630 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
18640 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
18650 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
18660 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18670 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
18680 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
18690 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65  .  }..multi_sele
186a0 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d  ct_end:.  pDest-
186b0 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  >iSdst = dest.iS
186c0 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  dst;.  pDest->nS
186d0 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74  dst = dest.nSdst
186e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
186f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
18700 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ete);.  return r
18710 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
18720 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
18730 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
18740 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61  *.** Error messa
18750 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20  ge for when two 
18760 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  or more terms of
18770 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
18780 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ct have differen
18790 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74  t.** size result
187a0 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   sets..*/.void s
187b0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e  qlite3SelectWron
187c0 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50  gNumTermsError(P
187d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
187e0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
187f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
18800 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73  _Values ){.    s
18810 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18820 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
18830 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
18840 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
18850 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65  terms");.  }else
18860 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
18870 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
18880 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
18890 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
188a0 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
188b0 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
188c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
188d0 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
188e0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
188f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
18900 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
18910 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
18920 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
18930 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
18940 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
18950 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
18960 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20  to be output is 
18970 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e  contained in pIn
18980 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20  ->iSdst.  There 
18990 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73  are.** pIn->nSds
189a0 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  t columns to be 
189b0 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69  output.  pDest i
189c0 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70  s where the outp
189d0 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ut should.** be 
189e0 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52  sent..**.** regR
189f0 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d  eturn is the num
18a00 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73  ber of the regis
18a10 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
18a20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  subroutine.** re
18a30 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a  turn address..**
18a40 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30  .** If regPrev>0
18a50 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
18a60 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
18a70 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a  n a vector that.
18a80 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70  ** records the p
18a90 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
18aa0 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73   mem[regPrev] is
18ab0 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20   a flag that is 
18ac0 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72  false.** if ther
18ad0 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72  e has been no pr
18ae0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
18af0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
18b00 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e  n code is.** gen
18b10 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65  erated to suppre
18b20 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20  ss duplicates.  
18b30 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64  pKeyInfo is used
18b40 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a   for comparing.*
18b50 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  * keys..**.** If
18b60 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64   the LIMIT found
18b70 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73   in p->iLimit is
18b80 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69   reached, jump i
18b90 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a  mmediately to.**
18ba0 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74   iBreak..*/.stat
18bb0 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f  ic int generateO
18bc0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
18bd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18be0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
18bf0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
18c00 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
18c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18c20 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
18c30 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  nt */.  SelectDe
18c40 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20  st *pIn,        
18c50 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70  /* Coroutine sup
18c60 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  plying data */. 
18c70 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
18c80 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72  st,      /* Wher
18c90 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61  e to send the da
18ca0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ta */.  int regR
18cb0 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20  eturn,          
18cc0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64  /* The return ad
18cd0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a  dress register *
18ce0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c  /.  int regPrev,
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
18d00 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72  revious result r
18d10 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69  egister.  No uni
18d20 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a  queness if 0 */.
18d30 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18d40 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72  nfo,      /* For
18d50 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20   comparing with 
18d60 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a  previous entry *
18d70 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
18d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
18d90 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68  ump here if we h
18da0 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a  it the LIMIT */.
18db0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
18dc0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
18dd0 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20  int iContinue;. 
18de0 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64   int addr;..  ad
18df0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
18e00 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
18e10 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71    iContinue = sq
18e20 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18e30 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70  el(v);..  /* Sup
18e40 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
18e50 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45   for UNION, EXCE
18e60 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
18e70 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  T .  */.  if( re
18e80 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74  gPrev ){.    int
18e90 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20   addr1, addr2;. 
18ea0 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
18eb0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18ec0 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65  OP_IfNot, regPre
18ed0 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  v); VdbeCoverage
18ee0 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  (v);.    addr2 =
18ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f00 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
18f10 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
18f20 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
18f30 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dst,.           
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f50 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
18f60 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
18f70 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
18f80 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
18f90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18fa0 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69  Jump, addr2+2, i
18fb0 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b  Continue, addr2+
18fc0 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
18fd0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
18fe0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18ff0 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
19000 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19010 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69   OP_Copy, pIn->i
19020 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
19030 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a   pIn->nSdst-1);.
19040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19050 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19060 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
19070 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
19080 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
19090 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
190a0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
190b0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
190c0 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
190d0 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
190e0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
190f0 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
19100 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
19110 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  );..  assert( pD
19120 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
19130 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65  Exists );.  asse
19140 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
19150 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  !=SRT_Table );. 
19160 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e   switch( pDest->
19170 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
19180 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
19190 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
191a0 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
191b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
191c0 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
191d0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
191e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
191f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
19200 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
19210 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
19220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19230 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
19240 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
19250 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
19260 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
19270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19280 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
19290 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
192a0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
192b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
192c0 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
192d0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
192e0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
192f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
19300 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
19310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19320 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19330 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
19340 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19350 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
19360 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19370 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
19380 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
19390 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
193a0 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
193b0 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
193c0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
193d0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  "..    */.    ca
193e0 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
193f0 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
19400 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
19410 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20  >nSdst>1 );.    
19420 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
19430 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19440 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19450 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19460 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
19470 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
19480 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72  st, .          r
19490 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  1, pDest->zAffSd
194a0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
194b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
194c0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
194d0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
194e0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
194f0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
19500 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
19510 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
19520 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
19530 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20  m, r1,.         
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49    pIn->iSdst, pI
19560 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
19570 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19580 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19590 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
195a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
195b0 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
195c0 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
195d0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
195e0 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
195f0 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
19600 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
19610 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
19620 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
19630 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
19640 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
19650 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
19660 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
19670 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
19680 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==1 || pParse->n
19690 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61  Err>0 );  testca
196a0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d  se( pIn->nSdst!=
196b0 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
196c0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
196d0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
196e0 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
196f0 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
19700 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
19710 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
19720 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
19730 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
19740 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
19750 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
19760 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
19770 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  /..    /* The re
19780 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
19790 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
197a0 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
197b0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
197c0 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68  Dest->iSdst.  Th
197d0 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
197e0 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
197f0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
19800 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
19810 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
19820 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
19830 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73  pDest->iSdst = s
19840 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
19850 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
19860 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nSdst);.        
19870 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70  pDest->nSdst = p
19880 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20  In->nSdst;.     
19890 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
198a0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
198b0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
198c0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70   pDest->iSdst, p
198d0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
198e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
198f0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
19900 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
19910 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19920 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
19930 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76  none of the abov
19940 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e, then the resu
19950 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  lt destination m
19960 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52  ust be.    ** SR
19970 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20  T_Output.  This 
19980 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
19990 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79   called with any
199a0 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65   other.    ** de
199b0 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20  stination other 
199c0 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61  than the ones ha
199d0 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53  ndled above or S
199e0 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a  RT_Output..    *
199f0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54  *.    ** For SRT
19a00 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73  _Output, results
19a10 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
19a20 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
19a30 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a  isters.  .    **
19a40 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73   Then the OP_Res
19a50 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73  ultRow opcode is
19a60 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73   used to cause s
19a70 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f  qlite3_step() to
19a80 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  .    ** return t
19a90 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72  he next row of r
19aa0 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  esult..    */.  
19ab0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
19ac0 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
19ad0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
19ae0 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  put );.      sql
19af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19b00 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
19b10 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
19b20 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
19b30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
19b40 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
19b50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
19b60 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
19b70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19b80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
19b90 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
19ba0 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
19bb0 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
19bc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
19bd0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
19be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19bf0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
19c00 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
19c10 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
19c20 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
19c30 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
19c40 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
19c50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
19c60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19c70 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
19c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19c90 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
19ca0 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
19cb0 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
19cc0 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
19cd0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
19ce0 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
19cf0 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
19d00 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
19d10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
19d20 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
19d30 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
19d40 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
19d50 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
19d60 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
19d70 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
19d80 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
19d90 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
19da0 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
19db0 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
19dc0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
19dd0 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
19de0 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
19df0 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
19e00 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
19e10 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
19e20 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
19e30 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
19e40 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
19e50 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
19e60 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
19e70 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
19e80 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
19e90 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
19ea0 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
19eb0 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
19ec0 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
19ed0 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
19ee0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
19ef0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
19f00 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
19f10 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
19f20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
19f40 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
19f50 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
19f60 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
19f70 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
19f80 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
19f90 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
19fa0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
19fb0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
19fc0 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
19fd0 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
19fe0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
19ff0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
1a000 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
1a010 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
1a020 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
1a030 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
1a040 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
1a050 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
1a060 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1a070 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1a080 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1a090 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
1a0a0 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
1a0b0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1a0c0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
1a0d0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
1a0e0 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
1a0f0 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
1a100 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1a110 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1a120 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
1a130 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
1a140 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
1a150 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
1a160 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
1a170 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
1a180 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
1a190 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
1a1a0 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
1a1b0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1a1c0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
1a1d0 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
1a1e0 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
1a1f0 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
1a200 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
1a210 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a220 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
1a230 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
1a240 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
1a250 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
1a260 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
1a270 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1a280 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1a290 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1a2a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1a2b0 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
1a2c0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
1a2d0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
1a2e0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
1a2f0 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
1a300 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
1a310 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
1a330 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
1a340 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
1a350 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
1a360 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
1a370 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
1a380 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
1a390 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
1a3a0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
1a3b0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
1a3c0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
1a3d0 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
1a3e0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
1a3f0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1a400 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1a410 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1a420 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
1a430 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
1a440 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
1a450 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
1a460 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
1a470 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
1a480 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
1a490 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
1a4a0 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
1a4b0 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
1a4c0 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
1a4d0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
1a4e0 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
1a4f0 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
1a500 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
1a510 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
1a520 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
1a530 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
1a540 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
1a550 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
1a560 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
1a570 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
1a580 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
1a590 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
1a5a0 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
1a5b0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
1a5c0 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
1a5d0 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
1a5e0 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
1a5f0 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
1a600 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
1a610 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
1a620 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
1a630 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
1a640 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
1a650 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
1a660 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1a670 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
1a680 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
1a690 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
1a6a0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
1a6b0 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
1a6c0 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
1a6d0 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
1a6e0 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
1a6f0 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
1a700 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
1a710 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1a720 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
1a730 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
1a740 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
1a750 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
1a760 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
1a770 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
1a780 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
1a790 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
1a7a0 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
1a7b0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
1a7c0 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
1a7d0 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
1a7e0 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
1a7f0 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
1a800 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
1a810 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
1a820 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
1a830 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
1a840 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
1a850 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
1a860 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
1a870 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
1a880 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
1a890 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
1a8a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
1a8b0 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
1a8c0 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
1a8d0 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
1a8e0 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
1a8f0 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
1a900 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
1a910 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
1a920 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
1a930 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
1a940 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
1a950 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
1a960 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
1a970 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
1a980 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
1a990 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
1a9a0 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
1a9b0 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
1a9c0 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
1a9d0 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
1a9e0 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
1a9f0 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
1aa00 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
1aa10 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
1aa20 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
1aa30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1aa40 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
1aa50 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
1aa60 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
1aa70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1aa80 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1aa90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1aaa0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1aab0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
1aac0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
1aad0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1aae0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
1aaf0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
1ab00 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
1ab10 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
1ab20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
1ab30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1ab40 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
1ab50 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
1ab60 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
1ab70 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
1ab80 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
1ab90 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1aba0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1abb0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
1abc0 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
1abd0 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
1abe0 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
1abf0 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
1ac00 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
1ac10 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
1ac20 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
1ac30 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
1ac40 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
1ac50 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
1ac60 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1ac70 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
1ac80 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
1ac90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1aca0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1acb0 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
1acc0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1acd0 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
1ace0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1acf0 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
1ad00 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ad10 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
1ad20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ad30 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
1ad40 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1ad50 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
1ad60 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1ad70 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
1ad80 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
1ad90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
1ada0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1adb0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1adc0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
1add0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1ade0 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
1adf0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1ae00 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
1ae10 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1ae20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
1ae30 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
1ae40 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
1ae50 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1ae60 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
1ae70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1ae80 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
1ae90 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
1aea0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1aeb0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20   addrEofA_noB;  
1aec0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20     /* Alternate 
1aed0 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73  addrEofA if B is
1aee0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a   uninitialized *
1aef0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
1af00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1af10 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1af20 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
1af30 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1af40 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
1af50 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1af60 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
1af70 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1af80 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
1af90 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1afa0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
1afb0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1afc0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
1afd0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1afe0 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
1aff0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
1b000 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
1b010 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
1b020 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
1b030 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
1b040 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
1b050 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
1b060 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
1b070 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
1b080 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
1b090 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
1b0a0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
1b0b0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
1b0c0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
1b0d0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
1b0e0 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
1b0f0 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
1b100 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1b110 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
1b120 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
1b130 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1b140 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
1b150 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
1b160 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
1b170 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
1b180 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
1b190 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
1b1a0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
1b1b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1b1d0 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
1b1e0 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
1b1f0 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
1b200 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1b210 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
1b220 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
1b230 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
1b240 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
1b250 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
1b260 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
1b270 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
1b280 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1b290 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1b2a0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
1b2b0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1b2c0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
1b2d0 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
1b2e0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1b2f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1b300 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1b310 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
1b320 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1b330 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1b340 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
1b350 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b360 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
1b370 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1b380 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
1b390 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
1b3a0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
1b3b0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
1b3c0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
1b3d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
1b3e0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
1b3f0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
1b400 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
1b410 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
1b420 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
1b430 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
1b440 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
1b450 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1b460 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1b470 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
1b480 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
1b490 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
1b4a0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
1b4b0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
1b4c0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1b4d0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
1b4e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b4f0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
1b500 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
1b510 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
1b520 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
1b530 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
1b540 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
1b550 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1b560 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
1b570 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1b580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
1b590 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
1b5a0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
1b5b0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
1b5c0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
1b5d0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
1b5e0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
1b5f0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
1b600 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1b610 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
1b620 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
1b630 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
1b640 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
1b650 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
1b660 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
1b670 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
1b680 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
1b690 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
1b6a0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
1b6b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
1b6c0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1b6d0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1b6e0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
1b6f0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
1b700 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
1b710 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
1b720 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
1b730 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1b740 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1b750 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1b760 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1b770 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
1b780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b790 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
1b7a0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1b7b0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1b7c0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
1b7d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1b7e0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1b7f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1b800 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
1b810 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
1b820 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
1b830 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
1b840 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = i;.        p->
1b850 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1b860 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1b870 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1b880 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
1b890 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
1b8a0 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
1b8b0 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
1b8c0 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
1b8d0 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
1b8e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b8f0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1b900 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
1b910 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
1b920 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
1b930 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
1b940 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
1b950 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1b960 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
1b970 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
1b980 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
1b990 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
1b9a0 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
1b9b0 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
1b9c0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1b9d0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
1b9e0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
1b9f0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
1ba00 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
1ba10 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
1ba20 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
1ba30 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
1ba40 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
1ba50 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
1ba60 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1ba70 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
1ba80 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
1ba90 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
1baa0 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
1bab0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1bac0 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
1bad0 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
1bae0 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
1baf0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
1bb00 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
1bb10 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1bb20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1bb30 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1bb40 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
1bb50 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1bb60 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
1bb70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1bb80 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
1bb90 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
1bba0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
1bbb0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
1bbc0 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
1bbd0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
1bbe0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
1bbf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1bc00 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
1bc10 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
1bc20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bc30 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
1bc40 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
1bc50 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1bc60 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
1bc70 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1bc80 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
1bc90 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
1bca0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
1bcb0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
1bcc0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1bcd0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
1bce0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
1bcf0 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
1bd00 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
1bd10 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
1bd20 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
1bd30 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
1bd40 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1bd50 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
1bd60 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
1bd70 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1bd80 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
1bd90 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1bda0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
1bdb0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
1bdc0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
1bdd0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
1bde0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1bdf0 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
1be00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1be10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1be20 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
1be30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1be40 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1be50 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
1be60 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
1be70 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
1be80 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
1be90 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
1bea0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1beb0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
1bec0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
1bed0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
1bee0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
1bef0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
1bf00 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
1bf10 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
1bf20 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
1bf30 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
1bf40 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
1bf50 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1bf60 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
1bf70 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
1bf80 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
1bf90 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
1bfa0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
1bfb0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1bfc0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
1bfd0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1bfe0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1bff0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1c000 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1c010 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1c020 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1c030 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1c040 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1c050 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1c060 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1c070 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1c080 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1c090 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1c0a0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1c0b0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1c0c0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1c0d0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1c0e0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1c0f0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1c100 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1c110 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1c120 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1c130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c140 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1c150 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1c160 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1c170 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1c1a0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1c1b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c1c0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1c1d0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1c1e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1c1f0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1c200 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1c210 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1c220 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1c230 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1c240 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
1c250 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1c260 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
1c270 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1c280 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
1c290 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
1c2a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1c2b0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
1c2c0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1c2d0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
1c2e0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1c2f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1c300 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
1c310 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1c320 64 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69  ddrB);..  Explai
1c330 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
1c340 73 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25  se, 1, "MERGE (%
1c350 73 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  s)", selectOpNam
1c360 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f  e(p->op)));..  /
1c370 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1c380 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1c390 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1c3a0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
1c3b0 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
1c3c0 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
1c3d0 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
1c3e0 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
1c3f0 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
1c400 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1c410 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1c420 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1c430 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1c440 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1c450 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
1c460 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
1c470 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
1c480 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
1c490 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1c4a0 69 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  itA;.  ExplainQu
1c4b0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
1c4c0 20 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20   1, "LEFT"));.  
1c4d0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1c4e0 53 65 74 49 64 28 70 50 61 72 73 65 2c 20 70 50  SetId(pParse, pP
1c4f0 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  rior);.  sqlite3
1c500 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1c510 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
1c520 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1c530 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1c540 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1c550 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1c560 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47   addr1);..  /* G
1c570 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
1c580 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
1c590 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1c5a0 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
1c5b0 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
1c5c0 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
1c5d0 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
1c5e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1c5f0 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1c600 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1c610 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1c620 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1c630 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53  gAddrB, 0, addrS
1c640 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43  electB);.  VdbeC
1c650 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68  omment((v, "righ
1c660 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
1c670 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
1c680 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
1c690 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
1c6a0 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
1c6b0 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
1c6c0 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
1c6d0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
1c6e0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
1c6f0 52 49 47 48 54 22 29 29 3b 0a 20 20 45 78 70 6c  RIGHT"));.  Expl
1c700 61 69 6e 51 75 65 72 79 50 6c 61 6e 53 65 74 49  ainQueryPlanSetI
1c710 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
1c720 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1c730 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
1c740 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1c750 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
1c760 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
1c770 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
1c780 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1c790 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  e(v, regAddrB);.
1c7a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1c7b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1c7c0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1c7d0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1c7e0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
1c7f0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1c800 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1c810 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1c820 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1c830 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1c840 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
1c850 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
1c860 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1c870 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
1c8a0 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1c8c0 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1c8d0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
1c8e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1c8f0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1c900 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1c910 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
1c920 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1c930 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1c940 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1c950 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1c960 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1c970 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1c980 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1c990 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1c9a0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
1c9b0 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
1c9c0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1c9d0 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1c9e0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1c9f0 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
1ca00 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1ca30 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1ca40 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
1ca50 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
1ca60 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ca70 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1ca80 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1ca90 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1caa0 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
1cab0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1cac0 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
1cad0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1cae0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
1caf0 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
1cb00 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1cb10 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
1cb20 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
1cb30 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1cb40 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1cb50 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
1cb60 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1cb70 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
1cb80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cb90 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1cba0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
1cbb0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1cbc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cbd0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1cbe0 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
1cbf0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1cc20 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1cc30 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1cc40 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
1cc50 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1cc60 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1cc70 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
1cc80 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1cc90 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ow);.  }..  /* G
1cca0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1ccb0 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1ccc0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1ccd0 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
1cce0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1ccf0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1cd00 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
1cd10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1cd20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1cd30 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
1cd40 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
1cd50 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
1cd60 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1cd70 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
1cd80 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
1cd90 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
1cda0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1cdb0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1cdc0 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
1cdd0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
1cde0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1cdf0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1ce00 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1ce10 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1ce20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ce30 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1ce40 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62  , labelEnd); Vdb
1ce50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ce60 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1ce70 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  o(v, addrEofB);.
1ce80 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1ce90 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1cea0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1ceb0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1cec0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1ced0 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1cee0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1cef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cf00 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1cf10 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1cf20 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1cf30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1cf40 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1cf50 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1cf60 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1cf70 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1cf80 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1cf90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cfa0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1cfb0 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1cfc0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1cfd0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1cfe0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1cff0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1d000 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1d010 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1d020 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1d030 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1d040 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1d050 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1d060 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d070 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1d080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d090 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1d0a0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1d0b0 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1d0c0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1d0d0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1d0e0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1d0f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d100 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1d110 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1d120 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d130 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1d140 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1d150 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1d160 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1d170 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1d180 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1d190 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1d1a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d1b0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1d1c0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1d1d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1d1e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1d1f0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1d200 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1d210 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1d220 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1d230 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1d240 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
1d250 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
1d260 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
1d270 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1d280 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1d290 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
1d2a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d2b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1d2c0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1d2d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1d2e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d2f0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d300 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1d310 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1d320 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1d330 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1d340 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1d350 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1d360 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1d370 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1d380 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d390 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1d3a0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1d3b0 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1d3c0 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1d3d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d3e0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1d3f0 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1d400 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1d430 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1d440 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1d450 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1d460 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1d470 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1d480 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1d490 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1d4a0 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1d4b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1d4c0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1d4d0 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1d4e0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1d4f0 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1d500 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1d510 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1d520 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1d530 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1d540 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1d550 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1d560 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1d570 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1d580 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1d590 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1d5a0 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1d5b0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1d5c0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1d5d0 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1d5e0 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1d5f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1d600 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1d610 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1d620 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1d630 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1d640 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1d650 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70  ries ****/.  Exp
1d660 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
1d670 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
1d680 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1d690 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1d6a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1d6b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1d6c0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1d6d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a  ITE_OMIT_VIEW)..
1d6e0 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
1d6f0 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65  f the SubstConte
1d700 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  xt object descri
1d710 62 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74  bes an substitut
1d720 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62  ion edit.** to b
1d730 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61  e performed on a
1d740 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a   parse tree..**.
1d750 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65  ** All reference
1d760 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
1d770 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65  table iTable are
1d780 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1d790 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  by corresponding
1d7a0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1d7b0 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79  in pEList..*/.ty
1d7c0 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62  pedef struct Sub
1d7d0 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61  stContext {.  Pa
1d7e0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1d7f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1d800 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1d810 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20  /.  int iTable; 
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d830 20 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e   Replace referen
1d840 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ces to this tabl
1d850 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54  e */.  int iNewT
1d860 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1d870 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75   /* New table nu
1d880 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mber */.  int is
1d890 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20  LeftJoin;       
1d8a0 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46      /* Add TK_IF
1d8b0 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65  _NULL_ROW opcode
1d8c0 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63  s on each replac
1d8d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ement */.  ExprL
1d8e0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1d8f0 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d       /* Replacem
1d900 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ent expressions 
1d910 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78  */.} SubstContex
1d920 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  t;../* Forward D
1d930 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
1d940 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1d950 45 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f  ExprList(SubstCo
1d960 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74  ntext*, ExprList
1d970 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
1d980 73 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73  substSelect(Subs
1d990 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63  tContext*, Selec
1d9a0 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  t*, int);../*.**
1d9b0 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
1d9c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1d9d0 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
1d9e0 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
1d9f0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1da00 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
1da10 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
1da20 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
1da30 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
1da40 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
1da50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1da60 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
1da70 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
1da80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1da90 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
1daa0 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
1dab0 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
1dac0 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
1dad0 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
1dae0 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
1daf0 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
1db00 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
1db10 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1db20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
1db30 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
1db40 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
1db50 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
1db60 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
1db70 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
1db80 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
1db90 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
1dba0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
1dbb0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
1dbc0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
1dbd0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
1dbe0 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
1dbf0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1dc00 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
1dc10 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
1dc20 45 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e  Expr(.  SubstCon
1dc30 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f  text *pSubst,  /
1dc40 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1dc50 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f   the substitutio
1dc60 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1dc70 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
1dc80 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1dc90 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1dca0 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rs */.){.  if( p
1dcb0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
1dcc0 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
1dcd0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1dce0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
1dcf0 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68   && pExpr->iRigh
1dd00 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62  tJoinTable==pSub
1dd10 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a  st->iTable.  ){.
1dd20 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68      pExpr->iRigh
1dd30 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75  tJoinTable = pSu
1dd40 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1dd50 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
1dd60 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
1dd70 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
1dd80 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20  =pSubst->iTable 
1dd90 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
1dda0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
1ddb0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1ddc0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
1ddd0 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1dde0 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
1ddf0 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73  r *pCopy = pSubs
1de00 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
1de10 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1de20 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69  pr;.      Expr i
1de30 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20  fNullRow;.      
1de40 61 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e  assert( pSubst->
1de50 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1de60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62  pr->iColumn<pSub
1de70 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st->pEList->nExp
1de80 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
1de90 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
1dea0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
1deb0 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
1dec0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1ded0 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29  sVector(pCopy) )
1dee0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1def0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
1df00 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20  pSubst->pParse, 
1df10 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65  pCopy);.      }e
1df20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1df30 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73  ite3 *db = pSubs
1df40 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  t->pParse->db;. 
1df50 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73         if( pSubs
1df60 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26  t->isLeftJoin &&
1df70 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43   pCopy->op!=TK_C
1df80 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1df90 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c     memset(&ifNul
1dfa0 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lRow, 0, sizeof(
1dfb0 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20  ifNullRow));.   
1dfc0 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1dfd0 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c  .op = TK_IF_NULL
1dfe0 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20  _ROW;.          
1dff0 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20  ifNullRow.pLeft 
1e000 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
1e010 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61     ifNullRow.iTa
1e020 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1e030 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ewTable;.       
1e040 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75     pCopy = &ifNu
1e050 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  llRow;.        }
1e060 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1e070 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1e080 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20  b, pCopy, 0);.  
1e090 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1e0a0 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  & pSubst->isLeft
1e0b0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Join ){.        
1e0c0 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1e0d0 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65  y(pNew, EP_CanBe
1e0e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
1e0f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1e100 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  w && ExprHasProp
1e110 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72  erty(pExpr,EP_Fr
1e120 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1e130 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68       pNew->iRigh
1e140 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78  tJoinTable = pEx
1e150 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1e160 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45  ble;.          E
1e170 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1e180 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  New, EP_FromJoin
1e190 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e1a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e1b0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1e1c0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1e1d0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1e1e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1e1f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1e200 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
1e210 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  W && pExpr->iTab
1e220 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1e230 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  le ){.      pExp
1e240 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  r->iTable = pSub
1e250 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1e260 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
1e270 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1e280 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1e290 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
1e2a0 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1e2b0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1e2c0 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1e2d0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1e2e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e2f0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1e300 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1e310 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1e320 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  x.pSelect, 1);. 
1e330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e340 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1e350 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1e360 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1e370 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1e380 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1e390 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1e3a0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1e3b0 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1e3c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1e3d0 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1e3e0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
1e3f0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1e400 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1e410 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1e420 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  utes */.){.  int
1e430 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1e440 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1e450 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1e460 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1e470 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1e480 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1e490 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61  pSubst, pList->a
1e4a0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
1e4b0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1e4c0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62  bstSelect(.  Sub
1e4d0 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1e4e0 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1e4f0 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1e500 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ution */.  Selec
1e510 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1e520 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1e530 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1e540 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1e550 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ons */.  int doP
1e560 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rior           /
1e570 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1e580 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1e590 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1e5a0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1e5b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e5c0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1e5d0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1e5e0 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1e5f0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1e600 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  t, p->pEList);. 
1e610 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1e620 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f  (pSubst, p->pGro
1e630 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74  upBy);.    subst
1e640 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1e650 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
1e660 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1e670 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1e680 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  , p->pHaving);. 
1e690 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1e6a0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1e6b0 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
1e6c0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1e6d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
1e6e0 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c!=0 );.    for(
1e6f0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1e700 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1e710 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1e720 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1e730 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  ct(pSubst, pItem
1e740 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
1e750 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1e760 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1e770 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1e780 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49  rList(pSubst, pI
1e790 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1e7a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e7b0 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1e7c0 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1e7d0 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1e7e0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1e7f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1e800 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1e810 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1e820 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1e830 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e840 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1e850 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e860 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1e870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1e880 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1e890 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1e8a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1e8b0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1e8c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1e8d0 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1e8e0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1e8f0 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1e900 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1e910 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1e920 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1e930 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1e940 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1e950 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1e960 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1e970 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1e980 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1e990 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1e9a0 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1e9b0 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1e9c0 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1e9d0 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1e9e0 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1e9f0 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1ea00 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1ea10 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1ea20 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1ea30 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1ea40 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1ea50 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1ea60 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1ea70 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1ea80 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1ea90 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1eaa0 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1eab0 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1eac0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ead0 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1eae0 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1eaf0 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1eb00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1eb10 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1eb20 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1eb30 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1eb40 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1eb50 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1eb60 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1eb70 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1eb80 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1eb90 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1eba0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1ebb0 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1ebc0 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1ebd0 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1ebe0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1ebf0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1ec00 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1ec10 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1ec20 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1ec30 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1ec40 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1ec50 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1ec60 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1ec70 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1ec80 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74   is subject to t
1ec90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1eca0 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  straints:.**.** 
1ecb0 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1ecc0 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1ecd0 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1ece0 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1ecf0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1ed00 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1ed10 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1ed20 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72  not both be aggr
1ed30 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1ed40 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1ed50 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1ed60 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1ed70 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1ed80 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66  **        (2) If
1ed90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1eda0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
1edb0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61  en.**        (2a
1edc0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1edd0 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  y must not be a 
1ede0 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1edf0 20 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65     (2b) the oute
1ee00 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1ee10 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a   use subqueries.
1ee20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1ee30 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1ee40 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  e FROM-clause su
1ee50 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1ee60 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20   candidate.**   
1ee70 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c            for fl
1ee80 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73  attening.  (This
1ee90 20 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65   is due to ticke
1eea0 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1eeb0 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20  bf80].**        
1eec0 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30       from 2015-0
1eed0 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1eee0 33 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3)  If the subqu
1eef0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1ef00 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1ef10 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20  FT JOIN then.** 
1ef20 20 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20         (3a) the 
1ef30 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1ef40 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1ef50 2a 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68  *        (3b) th
1ef60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1ef70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1ef80 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  y not contain a 
1ef90 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20  virtual.**      
1efa0 20 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64         table and
1efb0 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20  .**        (3c) 
1efc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1efd0 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
1efe0 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20  gregate..**.**  
1eff0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1f000 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49  ry can not be DI
1f010 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1f020 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1f030 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1f040 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1f050 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1f060 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1f070 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1f080 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1f090 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1f0a0 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1f0b0 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1f0c0 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1f0d0 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1f0e0 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1f0f0 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1f100 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1f110 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1f120 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1f130 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1f140 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
1f150 20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65     If the subque
1f160 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1f170 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f180 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
1f190 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1f1a0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1f1b0 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1f1c0 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1f1d0 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1f1e0 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1f1f0 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1f200 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1f210 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1f220 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1f230 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1f240 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1f250 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1f260 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1f270 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1f280 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1f290 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68  .**   (8)  If th
1f2a0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1f2b0 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1f2c0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1f2d0 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  ot be a join..**
1f2e0 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68  .**   (9)  If th
1f2f0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1f300 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1f310 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1f320 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e  ot be aggregate.
1f330 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1f340 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1f350 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1f360 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1f370 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1f380 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1f390 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1f3a0 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1f3b0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1f3c0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1f3d0 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a       constraint:
1f3e0 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72   "If the subquer
1f3f0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74  y is aggregate t
1f400 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
1f410 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d  ery .**        m
1f420 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1f430 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1f440 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1f450 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f460 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61   may not both ha
1f470 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1f480 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1f490 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1f4a0 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1f4b0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1f4c0 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1f4d0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1f4e0 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1f4f0 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1f500 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1f510 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1f520 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1f530 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1f540 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
1f550 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
1f560 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1f570 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1f580 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74  *.**  (15)  If t
1f590 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1f5a0 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
1f5b0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1f5c0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
1f5d0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1f5e0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20   use LIMIT..**  
1f5f0 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1f600 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1f610 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1f620 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49  ..**.**  (16)  I
1f630 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1f640 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1f650 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
1f660 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
1f670 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59      use ORDER BY
1f680 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
1f690 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
1f6a0 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
1f6b0 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
1f6c0 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
1f6d0 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
1f6e0 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
1f6f0 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71  17)  If the subq
1f700 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1f710 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a  nd select, then.
1f720 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20  **        (17a) 
1f730 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  all compound ope
1f740 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61  rators must be a
1f750 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a   UNION ALL, and.
1f760 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20  **        (17b) 
1f770 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20  no terms within 
1f780 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
1f790 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67  pound may be agg
1f7a0 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  regate.**       
1f7b0 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e         or DISTIN
1f7c0 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  CT, and.**      
1f7d0 20 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65    (17c) every te
1f7e0 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  rm within the su
1f7f0 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
1f800 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1f810 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
1f820 20 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65    (17d) the oute
1f830 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1f840 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
1f850 20 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67     (17d1) aggreg
1f860 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  ate, or.**      
1f870 20 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44          (17d2) D
1f880 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20  ISTINCT, or.**  
1f890 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
1f8a0 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  3) a join..**.**
1f8b0 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1f8c0 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1f8d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1f8e0 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1f8f0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1f900 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1f910 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1f920 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1f930 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1f940 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1f950 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1f960 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1f970 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1f980 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1f990 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1f9a0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1f9b0 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1f9c0 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1f9d0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1f9e0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1f9f0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1fa00 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1fa10 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1fa20 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1fa30 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1fa40 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1fa50 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1fa60 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1fa70 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1fa80 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1fa90 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1faa0 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1fab0 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1fac0 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1fad0 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1fae0 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1faf0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1fb00 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1fb10 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1fb20 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1fb30 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1fb40 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1fb50 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1fb60 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1fb70 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1fb80 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1fb90 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1fba0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1fbb0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1fbc0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1fbd0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1fbe0 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1fbf0 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  BY clause of the
1fc00 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1fc10 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1fc20 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1fc30 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1fc40 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1fc50 20 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75   (19)  If the su
1fc60 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49  bquery uses LIMI
1fc70 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  T then the outer
1fc80 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a   query may not.*
1fc90 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
1fca0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1fcb0 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
1fcc0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1fcd0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1fce0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
1fcf0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1fd00 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1fd10 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
1fd20 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
1fd30 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
1fd40 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
1fd50 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
1fd60 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
1fd70 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1fd80 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
1fd90 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
1fda0 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
1fdb0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1fdc0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1fdd0 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1fde0 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
1fdf0 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
1fe00 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
1fe10 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
1fe20 28 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62  (21)  If the sub
1fe30 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1fe40 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1fe50 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1fe60 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
1fe70 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
1fe80 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
1fe90 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
1fea0 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1feb0 6f 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76  ot be a recursiv
1fec0 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  e CTE..**.**  (*
1fed0 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  *)  Subsumed int
1fee0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  o restriction (1
1fef0 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74  7d3).  Was: If t
1ff00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1ff10 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65  s.**        a re
1ff20 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65  cursive CTE, the
1ff30 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
1ff40 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
1ff50 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20  pound query..** 
1ff60 20 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74         This rest
1ff70 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
1ff80 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
1ff90 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
1ffa0 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
1ffb0 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
1ffc0 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
1ffd0 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
1ffe0 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
1fff0 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
20000 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ct()..**.**  (**
20010 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
20020 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
20030 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
20040 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
20050 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62  *        The sub
20060 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20070 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
20080 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c  at uses the buil
20090 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a  t-in min() or .*
200a0 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28  *        or max(
200b0 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57  ) functions.  (W
200c0 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74  ithout this rest
200d0 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79  riction, a query
200e0 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20   like:.**       
200f0 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
20100 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20  (SELECT max(y), 
20110 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c  x FROM t1)" woul
20120 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  d not necessaril
20130 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75  y.**        retu
20140 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66  rn the value X f
20150 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d  or which Y was m
20160 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a  aximal.).**.**.*
20170 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
20180 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
20190 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
201a0 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
201b0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
201c0 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
201d0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
201e0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
201f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
20200 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
20210 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
20220 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
20230 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
20240 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
20250 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
20260 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20270 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
20280 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20290 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
202a0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
202b0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
202c0 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
202d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
202e0 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
202f0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
20300 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
20310 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
20320 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
20330 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20340 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
20350 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
20360 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
20370 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
20380 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
20390 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
203a0 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
203b0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
203c0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
203d0 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
203e0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20  /.  int isAgg   
203f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20400 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
20410 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
20420 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
20430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
20440 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
20450 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
20460 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
20470 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
20480 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
20490 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
204a0 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
204b0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
204c0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
204d0 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
204e0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
204f0 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
20500 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
20510 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
20520 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
20530 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
20540 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
20550 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20560 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
20570 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
20580 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
20590 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
205a0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
205b0 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
205c0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
205d0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
205e0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
205f0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
20600 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20  nt iNewParent = 
20610 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e  -1;/* Replacemen
20620 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72  t table for iPar
20630 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ent */.  int isL
20640 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20  eftJoin = 0; /* 
20650 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20  True if pSub is 
20660 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
20670 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
20680 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20      .  int i;   
20690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
206a0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
206b0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
206e0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
206f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20700 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
20710 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
20720 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20730 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
20740 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
20750 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
20760 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
20770 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
20780 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
20790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
207a0 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Prior==0 );.  if
207b0 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
207c0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
207d0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
207e0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
207f0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
20800 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
20810 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
20820 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
20830 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
20840 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
20850 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
20860 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
20870 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
20880 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
20890 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
208a0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
208b0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
208c0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
208d0 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
208e0 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
208f0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
20900 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
20910 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
20920 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
20930 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
20940 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
20950 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
20960 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
20970 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
20980 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
20990 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
209a0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
209b0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
209c0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
209d0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
209e0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
209f0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
20a00 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
20a10 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
20a20 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
20a30 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
20a40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20a50 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
20a60 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
20a70 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
20a80 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67  ub->pLimit->pRig
20a90 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ht ) return 0;  
20aa0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
20ab0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70  (14) */.  if( (p
20ac0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
20ad0 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20  Compound)!=0 && 
20ae0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
20af0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
20b30 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
20b40 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
20b50 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
20b60 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b80 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
20b90 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
20ba0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
20bb0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
20bc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
20bd0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20  Restriction (4) 
20be0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
20bf0 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
20c00 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
20c10 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
20c20 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
20c30 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
20c40 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
20c50 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
20c60 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
20c70 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
20cb0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
20cc0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
20cd0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
20ce0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
20d10 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
20d20 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
20d30 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d50 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
20d60 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
20d70 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
20d80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
20d90 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
20da0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
20db0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
20dc0 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
20dd0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
20de0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
20df0 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ive) ){.    retu
20e00 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
20e10 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20  tions (22) */.  
20e20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
20e30 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
20e40 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
20e50 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
20e60 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
20e70 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20e80 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
20e90 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20  f (3a). Example 
20ea0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
20eb0 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a  ot.  ** allowed:
20ec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
20ed0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
20ee0 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
20ef0 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
20f00 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
20f10 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
20f20 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
20f30 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
20f40 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
20f50 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
20f60 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
20f70 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
20f80 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  g..  **.  ** If 
20f90 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
20fa0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
20fb0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
20fc0 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  , then the outer
20fd0 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e  .  ** query cann
20fe0 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
20ff0 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69  te. (3c)  This i
21000 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66  s an artifact of
21010 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67   the way.  ** ag
21020 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f  gregates are pro
21030 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69  cessed - there i
21040 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74  s no mechanism t
21050 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20  o determine if. 
21060 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   ** the LEFT JOI
21070 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  N table should b
21080 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a  e all-NULL..  **
21090 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  .  ** See also t
210a0 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35  ickets #306, #35
210b0 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20  0, and #3300..  
210c0 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
210d0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
210e0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
210f0 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  {.    isLeftJoin
21100 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
21110 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  ubSrc->nSrc>1 ||
21120 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74   isAgg || IsVirt
21130 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30  ual(pSubSrc->a[0
21140 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
21150 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20   /*  (3a)       
21160 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28        (3c)     (
21170 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  3b) */.      ret
21180 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
21190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
211a0 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
211b0 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
211c0 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
211d0 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
211e0 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
211f0 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
21200 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
21210 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
21220 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
21230 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
21240 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
21250 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
21260 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  in, even.    ** 
21270 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
21280 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
21290 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
212a0 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
212b0 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f  ullRow .    ** o
212c0 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
212d0 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
212e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
212f0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29  Restriction (17)
21300 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
21310 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
21320 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
21330 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
21340 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
21350 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
21360 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
21370 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
21380 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
21390 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
213a0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
213b0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
213c0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
213d0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
213e0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
213f0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
21400 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21410 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21420 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
21430 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d  on (20) */.    }
21440 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
21450 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
21460 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
21470 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
21480 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
21490 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20  n 0; /* (17d1), 
214a0 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33  (17d2), or (17d3
214b0 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) */.    }.    f
214c0 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
214d0 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
214e0 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
214f0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
21500 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
21510 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
21520 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
21530 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
21540 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
21550 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
21560 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
21570 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
21580 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
21590 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
215a0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
215b0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
215c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
215d0 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
215e0 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
215f0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
21600 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
21610 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
21620 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a      /* (17b) */.
21630 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
21640 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
21650 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20  1->op!=TK_ALL)  
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21670 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20  * (17a) */.     
21680 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
21690 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20  ->nSrc<1        
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
216c0 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20  c) */.      ){. 
216d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
216e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
216f0 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
21700 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
21710 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
21720 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20  striction (18). 
21730 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
21740 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
21750 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
21760 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
21770 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
21780 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
21790 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
217a0 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
217b0 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
217c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
217d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72  }.  }..  /* Ex-r
217e0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a  estriction (23):
217f0 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77  .  ** The only w
21800 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75  ay that the recu
21810 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
21820 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20  CTE can contain 
21830 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20  a compound.  ** 
21840 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20  subquery is for 
21850 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
21860 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  be one term of a
21870 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
21880 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
21890 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e   is a join, then
218a0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
218b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
218c0 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a   stopped by.  **
218d0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
218e0 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d3).  */.  asser
218f0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
21900 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
21910 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69  =0 || pSub->pPri
21920 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a  or==0 );..  /***
21930 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
21940 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
21950 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
21960 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c  ed. *****/.  SEL
21970 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
21980 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73  e,p,("flatten %s
21990 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64  .%p from term %d
219a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
219b0 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53          pSub->zS
219c0 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46  elName, pSub, iF
219d0 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74  rom));..  /* Aut
219e0 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
219f0 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
21a00 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
21a10 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
21a20 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29  .  TESTONLY(i =)
21a30 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
21a40 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
21a50 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
21a60 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  );.  testcase( i
21a70 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b  ==SQLITE_DENY );
21a80 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
21a90 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
21aa0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
21ab0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  /* If the sub-qu
21ac0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
21ad0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
21ae0 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73  nt, then (by res
21af0 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31  trictions.  ** 1
21b00 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20  7 and 18 above) 
21b10 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49  it must be a UNI
21b20 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
21b30 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
21b40 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65   .  ** be of the
21b50 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
21b60 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70       SELECT <exp
21b70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73  r-list> FROM (<s
21b80 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72  ub-query>) <wher
21b90 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a  e-clause> .  **.
21ba0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
21bb0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
21bc0 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53  IMIT and/or OFFS
21bd0 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73  ET clauses. This
21be0 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61   block.  ** crea
21bf0 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f  tes N-1 copies o
21c00 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  f the parent que
21c10 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f  ry without any O
21c20 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f  RDER BY, LIMIT o
21c30 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63  r .  ** OFFSET c
21c40 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73  lauses and joins
21c50 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66   them to the lef
21c60 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
21c70 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
21c80 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c   using UNION ALL
21c90 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74   operators. In t
21ca0 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68  his case N is th
21cb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70  e number of simp
21cc0 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73  le.  ** select s
21cd0 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
21ce0 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
21cf0 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ery..  **.  ** E
21d00 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
21d10 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31  *     SELECT a+1
21d20 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20   FROM (.  **    
21d30 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
21d40 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
21d50 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
21d60 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79          SELECT y
21d70 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
21d80 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
21d90 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
21da0 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d  CT abs(z*2) FROM
21db0 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29   tab2.  **     )
21dc0 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45   WHERE a!=5 ORDE
21dd0 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
21de0 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
21df0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
21e00 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d   SELECT x+1 FROM
21e10 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d   tab WHERE x+1!=
21e20 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
21e30 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
21e40 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61  LECT y+1 FROM ta
21e50 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20  b WHERE y+1!=5. 
21e60 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
21e70 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
21e80 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f  T abs(z*2)+1 FRO
21e90 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73  M tab2 WHERE abs
21ea0 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20  (z*2)+1!=5.  ** 
21eb0 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20      ORDER BY 1. 
21ec0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c   **.  ** We call
21ed0 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f   this the "compo
21ee0 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
21ef0 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20  ttening"..  */. 
21f00 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
21f10 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
21f20 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
21f30 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
21f40 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
21f50 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
21f60 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
21f70 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
21f80 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65  pLimit;.    Sele
21f90 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
21fa0 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
21fb0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
21fc0 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
21fd0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
21fe0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
21ff0 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
22000 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
22010 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73  db, p, 0);.    s
22020 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
22030 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e  ame(pNew, pSub->
22040 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70  zSelName);.    p
22050 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
22060 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
22070 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
22080 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
22090 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
220a0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70  K_ALL;.    if( p
220b0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
220c0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
220d0 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
220e0 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
220f0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
22100 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
22110 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
22120 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  New;.      pNew-
22130 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
22140 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
22150 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ew;.      SELECT
22160 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70  TRACE(2,pParse,p
22170 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  ,("compound-subq
22180 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a  uery flattener".
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
221b0 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73  creates %s.%p as
221c0 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e 7a   peer\n",pNew->z
221d0 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b  SelName, pNew));
221e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
221f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22200 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
22210 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
22220 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
22230 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
22240 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
22250 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
22260 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
22270 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
22280 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
22290 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
222a0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
222b0 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
222c0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
222d0 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
222e0 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
222f0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
22300 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
22310 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22320 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
22330 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
22340 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
22350 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
22360 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
22370 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
22380 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
22390 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
223a0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
223b0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
223c0 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
223d0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
223e0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
223f0 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
22400 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
22410 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
22420 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
22430 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
22440 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
22450 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
22460 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
22470 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
22480 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
22490 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
224a0 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
224b0 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
224c0 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
224d0 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
224e0 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
224f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
22500 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
22510 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
22520 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
22530 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
22540 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
22550 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29  el->nTabRef==1 )
22560 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
22570 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
22580 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
22590 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
225a0 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
225b0 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
225c0 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
225d0 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
225e0 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
225f0 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
22600 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
22610 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20  el->nTabRef--;. 
22620 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
22630 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
22640 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
22650 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
22660 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
22670 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
22680 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
22690 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
226a0 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
226b0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
226c0 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
226d0 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
226e0 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
226f0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
22700 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
22710 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
22720 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
22730 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
22740 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
22750 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
22760 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
22770 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
22780 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
22790 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
227a0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
227b0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
227c0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
227d0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
227e0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
227f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
22800 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
22810 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
22820 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
22830 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
22840 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
22850 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
22860 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
22870 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
22880 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
22890 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
228a0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
228b0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
228c0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
228d0 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
228e0 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
228f0 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
22900 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
22910 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
22920 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
22930 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
22940 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
22950 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
22960 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
22970 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
22980 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
22990 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
229a0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
229b0 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
229c0 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
229d0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
229e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
229f0 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
22a00 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
22a10 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
22a20 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
22a30 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
22a40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
22a50 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
22a60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22a70 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
22a80 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
22a90 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
22aa0 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
22ab0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a  = pSubitem->fg.j
22ac0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
22ad0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
22ae0 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
22af0 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
22b00 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
22b10 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
22b20 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
22b30 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
22b40 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
22b50 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
22b60 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
22b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
22b80 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
22b90 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
22ba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22bb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
22bc0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
22bd0 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
22be0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
22bf0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
22c00 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
22c10 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
22c20 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
22c30 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
22c40 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
22c50 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
22c60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
22c70 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
22c80 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
22c90 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
22ca0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
22cb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
22cc0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
22cd0 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
22ce0 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
22cf0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
22d00 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
22d10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22d20 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
22d30 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
22d40 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
22d50 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
22d60 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
22d70 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
22d80 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
22d90 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
22da0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
22db0 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
22dc0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
22dd0 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75   query FROM clau
22de0 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20  se to 4 slots.. 
22df0 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65     ** The middle
22e00 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
22e10 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
22e20 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
22e30 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72  space.    ** for
22e40 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74   the two element
22e50 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
22e60 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
22e70 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
22e80 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
22e90 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
22ea0 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
22eb0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
22ec0 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
22ed0 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
22ee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
22ef0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
22f00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
22f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
22f20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
22f30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
22f40 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
22f50 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
22f60 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
22f70 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
22f80 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
22f90 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
22fa0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
22fb0 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
22fc0 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
22fd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22fe0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
22ff0 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
23000 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
23010 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
23020 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
23030 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53   iNewParent = pS
23040 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  ubSrc->a[i].iCur
23050 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  sor;.      memse
23060 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
23070 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
23080 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
23090 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
230a0 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  From].fg.jointyp
230b0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
230c0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
230d0 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
230e0 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
230f0 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
23100 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
23110 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
23120 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
23130 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
23140 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
23150 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
23160 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
23170 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
23180 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
23190 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
231a0 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
231b0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
231c0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
231d0 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
231e0 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
231f0 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
23200 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23210 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
23220 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
23230 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23240 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
23250 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
23260 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
23270 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
23280 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
23290 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
232a0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
232b0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
232c0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
232d0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
232e0 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
232f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
23300 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
23310 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
23320 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
23330 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
23340 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
23350 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
23360 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
23370 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
23380 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
23390 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
233a0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
233b0 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
233c0 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
233d0 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
233e0 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
233f0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
23400 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
23410 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
23420 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
23430 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
23440 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
23450 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
23460 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
23470 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
23480 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
23490 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
234a0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
234b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
234c0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
234d0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
234e0 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
234f0 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
23500 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
23510 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
23520 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
23530 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
23540 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
23550 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
23560 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
23570 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
23580 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
23590 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
235a0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
235b0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
235c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
235d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
235e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
235f0 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
23600 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
23610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
23620 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
23630 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
23640 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
23650 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
23660 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
23670 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
23680 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73  }.    pWhere = s
23690 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
236a0 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20  , pSub->pWhere, 
236b0 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65  0);.    if( isLe
236c0 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ftJoin>0 ){.    
236d0 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57    setJoinExpr(pW
236e0 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e 74  here, iNewParent
236f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
23700 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
23710 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
23720 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e  , pWhere, pParen
23730 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  t->pWhere);.    
23740 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
23750 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iled==0 ){.     
23760 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
23770 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20  .      x.pParse 
23780 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  = pParse;.      
23790 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65  x.iTable = iPare
237a0 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77  nt;.      x.iNew
237b0 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65  Table = iNewPare
237c0 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65  nt;.      x.isLe
237d0 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a  ftJoin = isLeftJ
237e0 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  oin;.      x.pEL
237f0 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69  ist = pSub->pELi
23800 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53  st;.      substS
23810 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e  elect(&x, pParen
23820 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  t, 0);.    }.  .
23830 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
23840 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
23850 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
23860 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
23870 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
23880 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
23890 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
238a0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
238b0 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
238c0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
238d0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
238e0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
238f0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
23900 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
23910 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
23920 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
23930 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
23940 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
23950 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
23960 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
23970 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
23980 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
23990 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
239a0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
239b0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
239c0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
239d0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
239e0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
239f0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
23a00 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
23a10 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
23a20 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
23a30 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
23a40 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
23a50 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
23a60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
23a70 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
23a80 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
23a90 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
23aa0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
23ab0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
23ac0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
23ad0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
23ae0 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e  "After flattenin
23af0 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  g:\n"));.    sql
23b00 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
23b10 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
23b20 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
23b30 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
23b40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
23b50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
23b60 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
23b70 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
23b80 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ....#if !defined
23b90 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
23ba0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
23bb0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
23bc0 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  IEW)./*.** Make 
23bd0 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61  copies of releva
23be0 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
23bf0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74  terms of the out
23c00 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a  er query into.**
23c10 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23c20 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20  e of subquery.  
23c30 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
23c40 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
23c50 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
23c60 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
23c70 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20  ) WHERE x=5 AND 
23c80 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  y=10;.**.** Tran
23c90 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a  sformed into:.**
23ca0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
23cb0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
23cc0 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
23cd0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
23ce0 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20  AND c-d=10).**  
23cf0 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44     WHERE x=5 AND
23d00 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   y=10;.**.** The
23d10 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68   hope is that th
23d20 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f  e terms added to
23d30 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   the inner query
23d40 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f   will make it mo
23d50 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e  re.** efficient.
23d60 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  .**.** Do not at
23d70 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d  tempt this optim
23d80 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a  ization if:.**.*
23d90 2a 20 20 20 28 31 29 20 28 2a 2a 20 54 68 69 73  *   (1) (** This
23da0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 77 61 73   restriction was
23db0 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37   removed on 2017
23dc0 2d 30 39 2d 32 39 2e 20 20 57 65 20 75 73 65 64  -09-29.  We used
23dd0 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
23de0 20 64 69 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f   disallow this o
23df0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
23e00 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
23e10 72 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a  ries, but now.**
23e20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
23e30 20 61 6c 6c 6f 77 65 64 20 62 79 20 70 75 74 74   allowed by putt
23e40 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 74 65  ing the extra te
23e50 72 6d 73 20 6f 6e 20 74 68 65 20 48 41 56 49 4e  rms on the HAVIN
23e60 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  G clause..**    
23e70 20 20 20 20 20 20 20 54 68 65 20 61 64 64 65 64         The added
23e80 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
23e90 73 20 70 6f 69 6e 74 6c 65 73 73 20 69 66 20 74  s pointless if t
23ea0 68 65 20 73 75 62 71 75 65 72 79 20 6c 61 63 6b  he subquery lack
23eb0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  s.**           a
23ec0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
23ed0 2e 20 20 42 75 74 20 73 75 63 68 20 61 20 48 41  .  But such a HA
23ee0 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 61  VING clause is a
23ef0 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20  lso harmless.** 
23f00 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 65            so the
23f10 72 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  re does not appe
23f20 61 72 20 74 6f 20 62 65 20 61 6e 79 20 72 65 61  ar to be any rea
23f30 73 6f 6e 20 74 6f 20 61 64 64 20 65 78 74 72 61  son to add extra
23f40 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20 20 20   logic.**       
23f50 20 20 20 20 74 6f 20 73 75 70 70 72 65 73 73 20      to suppress 
23f60 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20  it. **).**.**   
23f70 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (2) The inner qu
23f80 65 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72  ery is the recur
23f90 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63  sive part of a c
23fa0 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
23fb0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
23fc0 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (3) The inner qu
23fd0 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20  ery has a LIMIT 
23fe0 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68  clause (since th
23ff0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
24000 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20   WHERE.**       
24010 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e  close would chan
24020 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f  ge the meaning o
24030 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a  f the LIMIT)..**
24040 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e  .**   (4) The in
24050 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
24060 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
24070 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 61 6e  f a LEFT JOIN an
24080 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65  d the.**       e
24090 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
240a0 70 75 73 68 65 64 20 64 6f 77 6e 20 64 6f 65 73  pushed down does
240b0 20 6e 6f 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74   not come from t
240c0 68 65 20 4f 4e 20 63 6c 61 75 73 65 0a 2a 2a 20  he ON clause.** 
240d0 20 20 20 20 20 20 6f 6e 20 74 68 61 74 20 4c 45        on that LE
240e0 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20  FT JOIN..**.**  
240f0 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63   (5) The WHERE c
24100 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e  lause expression
24110 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74   originates in t
24120 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
24130 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
24140 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 77 68  f a LEFT JOIN wh
24150 65 72 65 20 69 43 75 72 73 6f 72 20 69 73 20 6e  ere iCursor is n
24160 6f 74 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  ot the right-han
24170 64 20 74 61 62 6c 65 20 6f 66 20 74 68 61 74 0a  d table of that.
24180 2a 2a 20 20 20 20 20 20 20 6c 65 66 74 20 6a 6f  **       left jo
24190 69 6e 2e 20 20 41 6e 20 65 78 61 6d 70 6c 65 3a  in.  An example:
241a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
241b0 20 53 45 4c 45 43 54 20 2a 0a 2a 2a 20 20 20 20   SELECT *.**    
241c0 20 20 20 20 20 20 20 46 52 4f 4d 20 28 53 45 4c         FROM (SEL
241d0 45 43 54 20 31 20 41 53 20 61 31 20 55 4e 49 4f  ECT 1 AS a1 UNIO
241e0 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20  N ALL SELECT 2) 
241f0 41 53 20 61 61 0a 2a 2a 20 20 20 20 20 20 20 20  AS aa.**        
24200 20 20 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20     JOIN (SELECT 
24210 31 20 41 53 20 62 32 20 55 4e 49 4f 4e 20 41 4c  1 AS b2 UNION AL
24220 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 62  L SELECT 2) AS b
24230 62 20 4f 4e 20 28 61 31 3d 62 32 29 0a 2a 2a 20  b ON (a1=b2).** 
24240 20 20 20 20 20 20 20 20 20 20 4c 45 46 54 20 4a            LEFT J
24250 4f 49 4e 20 28 53 45 4c 45 43 54 20 38 20 41 53  OIN (SELECT 8 AS
24260 20 63 33 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   c3 UNION ALL SE
24270 4c 45 43 54 20 39 29 20 41 53 20 63 63 20 4f 4e  LECT 9) AS cc ON
24280 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20   (b2=2);.**.**  
24290 20 20 20 20 20 54 68 65 20 63 6f 72 72 65 63 74       The correct
242a0 20 61 6e 73 77 65 72 20 69 73 20 74 68 72 65 65   answer is three
242b0 20 72 6f 77 73 3a 20 20 28 31 2c 31 2c 4e 55 4c   rows:  (1,1,NUL
242c0 4c 29 2c 28 32 2c 32 2c 38 29 2c 28 32 2c 32 2c  L),(2,2,8),(2,2,
242d0 39 29 2e 0a 2a 2a 20 20 20 20 20 20 20 42 75 74  9)..**       But
242e0 20 69 66 20 74 68 65 20 28 62 32 3d 32 29 20 74   if the (b2=2) t
242f0 65 72 6d 20 77 65 72 65 20 74 6f 20 62 65 20 70  erm were to be p
24300 75 73 68 65 64 20 64 6f 77 6e 20 69 6e 74 6f 20  ushed down into 
24310 74 68 65 20 62 62 20 73 75 62 71 75 65 72 79 2c  the bb subquery,
24320 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 74  .**       then t
24330 68 65 20 28 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f  he (1,1,NULL) ro
24340 77 20 77 6f 75 6c 64 20 62 65 20 73 75 70 70 72  w would be suppr
24350 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  essed..**.** Ret
24360 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e  urn 0 if no chan
24370 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64  ges are made and
24380 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65   non-zero if one
24390 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63   or more WHERE c
243a0 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61  lause.** terms a
243b0 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  re duplicated in
243c0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  to the subquery.
243d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
243e0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
243f0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
24400 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
24410 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72  rse context (for
24420 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72   malloc() and er
24430 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a  ror reporting) *
24440 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
24450 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q,        /* The
24460 20 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20   subquery whose 
24470 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
24480 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20  to be augmented 
24490 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
244a0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
244b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
244c0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
244d0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73  y */.  int iCurs
244e0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
244f0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
24500 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
24510 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
24520 6e 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  n        /* True
24530 20 69 66 20 70 53 75 62 71 20 69 73 20 74 68 65   if pSubq is the
24540 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
24550 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b   LEFT JOIN */.){
24560 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
24570 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a   int nChng = 0;.
24580 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20    if( pWhere==0 
24590 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
245a0 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67  ( pSubq->selFlag
245b0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
245c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
245d0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   restriction (2)
245e0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
245f0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e  TE_DEBUG.  /* On
24600 6c 79 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ly the first ter
24610 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  m of a compound 
24620 63 61 6e 20 68 61 76 65 20 61 20 57 49 54 48 20  can have a WITH 
24630 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b  clause.  But mak
24640 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f  e.  ** sure no o
24650 74 68 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d  ther terms are m
24660 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69  arked SF_Recursi
24670 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74  ve in case somet
24680 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a  hing changes.  *
24690 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  * in the future.
246a0 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65  .  */.  {.    Se
246b0 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20  lect *pX;  .    
246c0 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58  for(pX=pSubq; pX
246d0 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
246e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
246f0 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  (pX->selFlags & 
24700 28 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d  (SF_Recursive))=
24710 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
24720 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53  #endif..  if( pS
24730 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  ubq->pLimit!=0 )
24740 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
24750 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
24760 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c  3) */.  }.  whil
24770 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54  e( pWhere->op==T
24780 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68  K_AND ){.    nCh
24790 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68  ng += pushDownWh
247a0 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ereTerms(pParse,
247b0 20 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e   pSubq, pWhere->
247c0 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20  pRight,.        
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247e0 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 2c          iCursor,
247f0 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20   isLeftJoin);.  
24800 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
24810 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  e->pLeft;.  }.  
24820 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20  if( isLeftJoin. 
24830 20 20 26 26 20 28 45 78 70 72 48 61 73 50 72 6f    && (ExprHasPro
24840 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f  perty(pWhere,EP_
24850 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20  FromJoin)==0.   
24860 20 20 20 20 20 20 7c 7c 20 70 57 68 65 72 65 2d        || pWhere-
24870 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
24880 21 3d 69 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a  !=iCursor).  ){.
24890 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
248a0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
248b0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 45 78   */.  }.  if( Ex
248c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57  prHasProperty(pW
248d0 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e  here,EP_FromJoin
248e0 29 20 26 26 20 70 57 68 65 72 65 2d 3e 69 52 69  ) && pWhere->iRi
248f0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43  ghtJoinTable!=iC
24900 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
24910 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
24920 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d  ction (5) */.  }
24930 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
24940 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
24950 74 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f  t(pWhere, iCurso
24960 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b  r) ){.    nChng+
24970 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  +;.    while( pS
24980 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62  ubq ){.      Sub
24990 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20  stContext x;.   
249a0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
249b0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
249c0 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  >db, pWhere, 0);
249d0 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e  .      unsetJoin
249e0 45 78 70 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a  Expr(pNew, -1);.
249f0 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
24a00 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
24a10 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  .iTable = iCurso
24a20 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  r;.      x.iNewT
24a30 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
24a40 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f        x.isLeftJo
24a50 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e  in = 0;.      x.
24a60 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e  pEList = pSubq->
24a70 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e  pEList;.      pN
24a80 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 26  ew = substExpr(&
24a90 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  x, pNew);.      
24aa0 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
24ab0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
24ac0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  te ){.        pS
24ad0 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ubq->pHaving = s
24ae0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
24af0 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d  arse->db, pSubq-
24b00 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b  >pHaving, pNew);
24b10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24b20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
24b30 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
24b40 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
24b50 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20   pSubq->pWhere, 
24b60 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
24b70 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
24b80 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
24b90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
24ba0 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
24bb0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
24bc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
24bd0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
24be0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
24bf0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75  /../*.** The pFu
24c00 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  nc is the only a
24c10 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
24c20 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  n in the query. 
24c30 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a   Check to see.**
24c40 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
24c50 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
24c60 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
24c70 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  imization. .**.*
24c80 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
24c90 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
24ca0 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
24cb0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e  timization, then
24cc0 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61   set.** *ppMinMa
24cd0 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45 52  x to be an ORDER
24ce0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
24cf0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f 70   used for the op
24d00 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  timization.** an
24d10 64 20 72 65 74 75 72 6e 20 65 69 74 68 65 72 20  d return either 
24d20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
24d30 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
24d40 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e 67  BY_MAX depending
24d50 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20 70   on.** whether p
24d60 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29 20  Func is a min() 
24d70 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
24d80 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
24d90 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
24da0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
24db0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
24dc0 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a  ation, return.**
24dd0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
24de0 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75 73  ORMAL (which mus
24df0 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a  t be zero)..**.*
24e00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
24e10 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66  ust be called af
24e20 74 65 72 20 61 67 67 72 65 67 61 74 65 20 66 75  ter aggregate fu
24e30 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  nctions have bee
24e40 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75 74  n.** located but
24e50 20 62 65 66 6f 72 65 20 74 68 65 69 72 20 61 72   before their ar
24e60 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65  guments have bee
24e70 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20 61  n subjected to a
24e80 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c  ggregate.** anal
24e90 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ysis..*/.static 
24ea0 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 73  u8 minMaxQuery(s
24eb0 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
24ec0 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69 73   *pFunc, ExprLis
24ed0 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
24ee0 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
24ef0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
24f00 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
24f10 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72   value */.  Expr
24f20 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
24f30 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Func->x.pList;  
24f40 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
24f50 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
24f60 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24f70 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  zFunc;          
24f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
24f90 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
24fa0 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f  unction pFunc */
24fb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
24fc0 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72 74  derBy;.  u8 sort
24fd0 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Order;..  assert
24fe0 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29  ( *ppMinMax==0 )
24ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e  ;.  assert( pFun
25000 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  c->op==TK_AGG_FU
25010 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20  NCTION );.  if( 
25020 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c  pEList==0 || pEL
25030 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
25040 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a  return eRet;.  z
25050 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e  Func = pFunc->u.
25060 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71  zToken;.  if( sq
25070 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
25080 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
25090 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
250a0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
250b0 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
250c0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
250d0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
250e0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
250f0 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
25100 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
25110 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73  DERBY_MAX;.    s
25120 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
25130 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c  E_SO_DESC;.  }el
25140 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65  se{.    return e
25150 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69  Ret;.  }.  *ppMi
25160 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79 20  nMax = pOrderBy 
25170 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
25180 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
25190 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
251a0 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64 62  OrderBy!=0 || db
251b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
251c0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
251d0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30   ) pOrderBy->a[0
251e0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
251f0 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75 72  rtOrder;.  retur
25200 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
25210 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
25220 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
25230 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
25240 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
25250 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
25260 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
25270 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
25280 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
25290 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
252a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
252b0 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
252c0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
252d0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
252e0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
252f0 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
25300 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
25310 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
25320 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
25330 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
25340 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
25350 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
25360 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
25370 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
25380 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
25390 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
253a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
253b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
253c0 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
253d0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
253e0 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
253f0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
25400 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
25410 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
25420 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
25430 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
25440 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
25450 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
25460 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
25470 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
25480 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
25490 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
254a0 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
254b0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
254c0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
254d0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
254e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
254f0 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
25500 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
25510 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
25520 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
25530 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
25540 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
25550 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
25560 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
25570 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
25580 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
25590 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
255a0 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
255b0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
255c0 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
255d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
255e0 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
255f0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
25600 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
25610 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
25620 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
25630 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
25640 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
25650 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
25660 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
25670 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
25680 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
25690 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
256a0 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
256b0 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
256c0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
256d0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
256e0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
256f0 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
25700 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
25710 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
25720 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
25730 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
25740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25750 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
25760 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
25770 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
25780 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
25790 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
257a0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
257b0 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e  & pFrom->fg.isIn
257c0 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54  dexedBy ){.    T
257d0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
257e0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
257f0 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d  ar *zIndexedBy =
25800 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pFrom->u1.zInde
25810 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78  xedBy;.    Index
25820 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
25830 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
25840 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
25850 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
25860 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
25870 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20  zIndexedBy); .  
25880 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
25890 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
258a0 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
258b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
258c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
258d0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
258e0 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29  , zIndexedBy, 0)
258f0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
25900 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
25910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25920 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
25930 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42  }.    pFrom->pIB
25940 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
25950 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
25960 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
25970 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
25980 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
25990 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
259a0 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
259b0 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
259c0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
259d0 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
259e0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
259f0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
25a00 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
25a10 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
25a20 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
25a30 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
25a40 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
25a50 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
25a60 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
25a70 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
25a80 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
25a90 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
25aa0 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
25ab0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
25ac0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
25ad0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
25ae0 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
25af0 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
25b00 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
25b10 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
25b20 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
25b30 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
25b40 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
25b50 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
25b60 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
25b70 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
25b80 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
25b90 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
25ba0 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
25bb0 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
25bc0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
25bd0 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
25be0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
25bf0 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
25c00 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
25c10 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
25c20 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
25c30 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
25c40 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
25c50 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
25c60 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
25c70 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
25c80 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
25c90 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
25ca0 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
25cb0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
25cc0 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
25cd0 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
25ce0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
25cf0 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
25d00 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
25d10 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
25d20 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
25d30 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
25d40 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
25d50 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
25d60 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
25d70 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
25d80 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
25d90 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
25da0 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
25db0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
25dc0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
25dd0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
25de0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
25df0 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
25e00 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
25e10 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
25e20 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
25e30 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
25e40 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
25e50 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
25e60 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
25e70 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
25e80 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
25e90 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
25ea0 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
25eb0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
25ec0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
25ed0 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
25ee0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
25ef0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
25f00 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
25f10 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
25f20 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
25f30 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
25f40 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
25f50 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
25f60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
25f70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
25f80 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
25f90 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
25fa0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
25fb0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25fc0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
25fd0 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
25fe0 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
25ff0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
26000 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
26010 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
26020 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
26030 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
26040 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26050 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
26060 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
26070 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
26080 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
26090 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
260a0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
260b0 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
260c0 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
260d0 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
260e0 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
260f0 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
26100 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
26110 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
26120 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
26130 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
26140 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
26150 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
26160 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
26170 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
26180 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
26190 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
261a0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
261b0 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
261c0 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
261d0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
261e0 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
261f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
26200 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
26210 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
26220 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
26230 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
26240 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  e if the FROM cl
26250 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20  ause term pFrom 
26260 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  has table-valued
26270 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67   function.** arg
26280 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64  uments.  If it d
26290 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  oes, leave an er
262a0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
262b0 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
262c0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69  .** non-zero, si
262d0 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74  nce pFrom is not
262e0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
262f0 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
26300 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
26310 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75  c int cannotBeFu
26320 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  nction(Parse *pP
26330 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
26340 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
26350 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
26360 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
26370 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26380 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73  Msg(pParse, "'%s
26390 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74  ' is not a funct
263a0 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61  ion", pFrom->zNa
263b0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
263c0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
263d0 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
263e0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
263f0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69  .** Argument pWi
26400 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  th (which may be
26410 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f   NULL) points to
26420 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
26430 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54  f nested .** WIT
26440 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d  H contexts, from
26450 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d   inner to outerm
26460 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c  ost. If the tabl
26470 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
26480 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
26490 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73  element pItem is
264a0 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e   really a common
264b0 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f  -table-expressio
264c0 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e  n (CTE) .** then
264d0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
264e0 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66  r to the CTE def
264f0 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  inition for that
26500 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
26510 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c  e.** return NULL
26520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e  ..**.** If a non
26530 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72  -NULL value is r
26540 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70  eturned, set *pp
26550 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74  Context to point
26560 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20   to the With.** 
26570 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
26580 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c  returned CTE bel
26590 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ongs to..*/.stat
265a0 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73  ic struct Cte *s
265b0 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74  earchWith(.  Wit
265c0 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265e0 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73  Current innermos
265f0 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f  t WITH clause */
26600 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
26610 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20  t_item *pItem,  
26620 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
26630 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73  e element to res
26640 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a  olve */.  With *
26650 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20  *ppContext      
26660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26670 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65  : WITH clause re
26680 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e  turn value belon
26690 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f  gs to */.){.  co
266a0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
266b0 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44  .  if( pItem->zD
266c0 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a  atabase==0 && (z
266d0 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  Name = pItem->zN
266e0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57  ame)!=0 ){.    W
266f0 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  ith *p;.    for(
26700 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d  p=pWith; p; p=p-
26710 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20  >pOuter){.      
26720 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
26730 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
26740 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
26750 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
26760 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d  p(zName, p->a[i]
26770 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
26780 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65          *ppConte
26790 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
267a0 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69    return &p->a[i
267b0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
267c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
267d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
267e0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
267f0 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  tor maintains a 
26800 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20  stack of active 
26810 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20  WITH clauses.** 
26820 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d  with the inner-m
26830 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
26840 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70  being at the top
26850 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   of the stack..*
26860 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26870 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54  e pushes the WIT
26880 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20  H clause passed 
26890 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
268a0 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74  gument.** onto t
268b0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
268c0 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ack. If argument
268d0 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20   bFree is true, 
268e0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54  then this.** WIT
268f0 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65  H clause will ne
26900 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72  ver be popped fr
26910 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e  om the stack. In
26920 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a   this case it.**
26930 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
26940 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
26950 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e  Parse object. In
26960 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68   other cases, wh
26970 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20  en.** bFree==0, 
26980 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
26990 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c  will be freed al
269a0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c  ong with the SEL
269b0 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ECT .** statemen
269c0 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20  t with which it 
269d0 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a  is associated..*
269e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
269f0 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  thPush(Parse *pP
26a00 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74  arse, With *pWit
26a10 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20  h, u8 bFree){.  
26a20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30  assert( bFree==0
26a30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69   || (pParse->pWi
26a40 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  th==0 && pParse-
26a50 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29  >pWithToFree==0)
26a60 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20   );.  if( pWith 
26a70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26a80 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57  Parse->pWith!=pW
26a90 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68  ith );.    pWith
26aa0 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73  ->pOuter = pPars
26ab0 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
26ac0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
26ad0 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72  ith;.    if( bFr
26ae0 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69  ee ) pParse->pWi
26af0 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68  thToFree = pWith
26b00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
26b10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
26b20 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
26b30 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
26b40 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
26b50 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
26b60 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
26b70 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
26b80 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
26b90 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
26ba0 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
26bb0 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
26bc0 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
26bd0 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
26be0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
26bf0 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
26c00 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
26c10 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
26c20 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
26c30 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
26c40 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
26c50 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
26c60 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
26c70 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
26c80 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
26c90 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
26ca0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
26cb0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
26cc0 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
26cd0 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
26ce0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
26cf0 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
26d00 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
26d10 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
26d20 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
26d30 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
26d40 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
26d50 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
26d60 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
26d70 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
26d80 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
26d90 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
26da0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
26db0 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
26dc0 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
26dd0 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
26de0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26df0 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
26e00 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
26e10 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
26e20 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
26e30 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
26e40 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
26e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
26e60 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
26e70 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
26e80 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
26eb0 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
26ec0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
26ed0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
26ee0 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
26ef0 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
26f00 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
26f10 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
26f20 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
26f30 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
26f40 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
26f50 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
26f60 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
26f70 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
26f80 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
26f90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26fa0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
26fb0 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
26fc0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
26fd0 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
26fe0 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
26ff0 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
27000 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
27010 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
27020 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
27030 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
27040 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  /* If pCte->zCte
27050 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
27060 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
27070 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
27080 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
27090 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
270a0 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
270b0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
270c0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
270d0 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
270e0 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
270f0 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
27100 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  this is not a re
27110 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
27120 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  e..    ** In thi
27130 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e  s case, proceed.
27140 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74    */.    if( pCt
27150 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20  e->zCteErr ){.  
27160 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
27170 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
27180 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d  ->zCteErr, pCte-
27190 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
271a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
271b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
271c0 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  ( cannotBeFuncti
271d0 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  on(pParse, pFrom
271e0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
271f0 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73  E_ERROR;..    as
27200 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
27210 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  b==0 );.    pFro
27220 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
27230 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
27240 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
27250 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
27260 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
27270 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
27280 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
27290 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
272a0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
272b0 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
272c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
272d0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
272e0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
272f0 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
27300 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
27310 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
27320 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
27330 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
27340 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  ral | TF_NoVisib
27350 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72  leRowid;.    pFr
27360 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
27370 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
27380 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
27390 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
273a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
273b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
273c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61  OMEM_BKPT;.    a
273d0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
273e0 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
273f0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
27400 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
27410 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
27420 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
27430 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
27440 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
27450 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
27460 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
27470 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
27480 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
27490 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
274a0 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
274b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
274c0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
274d0 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
274e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
274f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27500 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
27510 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
27520 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
27530 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
27540 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
27550 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
27560 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
27570 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
27580 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
27590 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
275a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
275b0 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
275c0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
275d0 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
275e0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
275f0 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
27600 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
27610 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
27620 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
27630 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
27640 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
27650 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
27660 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
27670 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
27680 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20  >nTabRef>2 ){.  
27690 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
276a0 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
276b0 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
276c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
276d0 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
276e0 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
276f0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
27700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
27710 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
27720 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61  ssert( pTab->nTa
27730 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20  bRef==1 || .    
27740 20 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e          ((pSel->
27750 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
27760 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
27770 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  nTabRef==2 ));..
27780 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
27790 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
277a0 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
277b0 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
277c0 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
277d0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
277e0 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  = pWith;.    if(
277f0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
27800 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
27810 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70  pPrior = pSel->p
27820 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73  Prior;.      ass
27830 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69  ert( pPrior->pWi
27840 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  th==0 );.      p
27850 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70  Prior->pWith = p
27860 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  Sel->pWith;.    
27870 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
27880 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72  ect(pWalker, pPr
27890 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69  ior);.      pPri
278a0 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20  or->pWith = 0;. 
278b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
278c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
278d0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
278e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
278f0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
27900 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66  h;..    for(pLef
27910 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70  t=pSel; pLeft->p
27920 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65  Prior; pLeft=pLe
27930 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20  ft->pPrior);.   
27940 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   pEList = pLeft-
27950 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  >pEList;.    if(
27960 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a   pCte->pCols ){.
27970 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
27980 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
27990 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
279a0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
279b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
279c0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
279d0 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
279e0 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
279f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
27a00 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
27a10 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
27a20 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
27a30 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
27a40 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
27a50 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
27a60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27a70 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
27a80 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
27a90 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
27aa0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43   }..    sqlite3C
27ab0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
27ac0 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
27ad0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
27ae0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
27af0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
27b00 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
27b10 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
27b20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
27b30 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
27b40 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69  zCteErr = "multi
27b50 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
27b60 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
27b70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27b80 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
27b90 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72  r = "recursive r
27ba0 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75  eference in a su
27bb0 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20  bquery: %s";.   
27bc0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
27bd0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
27be0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
27bf0 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74   }.    pCte->zCt
27c00 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  eErr = 0;.    pP
27c10 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
27c20 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
27c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27c40 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
27c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27c60 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
27c70 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
27c80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
27c90 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
27ca0 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
27cb0 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
27cc0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
27cd0 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
27ce0 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
27cf0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
27d00 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
27d10 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
27d20 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
27d30 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
27d40 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
27d50 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
27d60 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
27d70 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
27d80 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
27d90 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
27da0 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
27db0 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
27dc0 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
27dd0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
27de0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
27df0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
27e00 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
27e10 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65  WAYS_TRUE(pParse
27e20 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70  ->pWith) && p->p
27e30 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
27e40 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69  With *pWith = fi
27e50 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
27e60 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70  pWith;.    if( p
27e70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20  With!=0 ){.     
27e80 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
27e90 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b  >pWith==pWith );
27ea0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70  .      pParse->p
27eb0 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f  With = pWith->pO
27ec0 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uter;.    }.  }.
27ed0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
27ee0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
27ef0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
27f00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
27f10 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
27f20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
27f30 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27f40 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
27f50 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
27f60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
27f70 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
27f80 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
27f90 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
27fa0 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
27fb0 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
27fc0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
27fd0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
27fe0 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
27ff0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
28000 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
28010 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
28020 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
28030 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
28040 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
28050 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
28060 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
28070 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
28080 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
28090 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
280a0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
280b0 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
280c0 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
280d0 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
280e0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
280f0 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
28100 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
28110 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
28120 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
28130 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
28140 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
28150 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
28160 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
28170 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72  ssing up the per
28180 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
28190 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
281a0 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
281b0 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
281c0 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
281d0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
281e0 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  commodate the NA
281f0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
28200 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
28210 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
28220 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
28230 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
28240 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
28250 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
28260 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
28270 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
28280 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
28290 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
282a0 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
282b0 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
282c0 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
282d0 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
282e0 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
282f0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
28300 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
28310 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
28320 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
28330 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
28340 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
28350 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
28360 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
28370 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
28380 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
28390 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
283a0 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
283b0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
283c0 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
283d0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
283e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
283f0 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
28400 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
28410 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
28420 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
28430 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
28440 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
28450 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73    u32 elistFlags
28460 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46   = 0;..  p->selF
28470 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
28480 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ded;.  if( db->m
28490 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a  allocFailed  ){.
284a0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
284b0 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  bort;.  }.  asse
284c0 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
284d0 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67  ;.  if( (selFlag
284e0 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
284f0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
28500 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
28510 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
28520 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
28530 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73  = p->pEList;.  s
28540 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
28550 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c  Parse, p->pWith,
28560 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   0);..  /* Make 
28570 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
28580 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
28590 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
285a0 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
285b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
285c0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
285d0 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
285e0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
285f0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
28600 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
28610 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
28620 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
28630 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
28640 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
28650 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
28660 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
28670 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
28680 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
28690 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
286a0 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
286b0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
286c0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
286d0 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
286e0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
286f0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
28700 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
28710 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
28720 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
28730 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
28740 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e  sert( pFrom->fg.
28750 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
28760 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  | pFrom->pTab!=0
28770 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
28780 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
28790 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
287a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
287b0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e  >pTab==0 );.#ifn
287c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
287d0 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
287e0 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
287f0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
28800 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
28810 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
28820 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
28830 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
28840 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
28850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
28860 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
28870 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
28880 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
28890 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
288a0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
288b0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
288c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
288d0 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
288e0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
288f0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
28900 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
28910 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
28920 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e  , pSel) ) return
28930 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
28940 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
28950 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
28960 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
28970 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
28980 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
28990 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
289a0 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
289b0 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
289c0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
289d0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
289e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
289f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
28a00 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  b, pFrom->zAlias
28a10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28a20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
28a30 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
28a40 69 6e 74 66 28 64 62 2c 20 22 73 75 62 71 75 65  intf(db, "subque
28a50 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  ry_%p", (void*)p
28a60 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
28a70 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
28a80 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
28a90 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
28aa0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  }.      sqlite3C
28ab0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
28ac0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
28ad0 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
28ae0 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
28af0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
28b00 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
28b10 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
28b20 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
28b30 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
28b40 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
28b50 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
28b60 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
28b70 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
28b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
28b90 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
28ba0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
28bb0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28bc0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
28bd0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
28be0 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
28bf0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
28c00 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
28c10 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
28c20 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
28c30 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
28c40 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28c50 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
28c60 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20  nTabRef>=0xffff 
28c70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28c80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
28c90 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
28ca0 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
28cb0 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
28cc0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
28cd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
28ce0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
28cf0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28d00 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
28d10 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
28d20 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
28d30 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
28d40 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65  Tab) && cannotBe
28d50 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
28d60 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
28d70 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
28d80 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ort;.      }.#if
28d90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
28da0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
28db0 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
28dc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
28dd0 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  E).      if( IsV
28de0 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
28df0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
28e00 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f  .        i16 nCo
28e10 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
28e20 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
28e30 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
28e40 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
28e50 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
28e60 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
28e70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
28e80 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
28e90 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
28ea0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
28eb0 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
28ec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28ed0 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46  SelectSetName(pF
28ee0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54  rom->pSelect, pT
28ef0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
28f00 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
28f10 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
28f20 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
28f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
28f40 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
28f50 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
28f60 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
28f70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
28f80 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
28f90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
28fa0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
28fb0 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
28fc0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
28fd0 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
28fe0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
28ff0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
29000 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
29010 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
29020 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29030 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
29040 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
29050 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
29060 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
29070 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
29080 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
29090 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
290a0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
290b0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
290c0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
290d0 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
290e0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
290f0 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
29100 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
29110 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
29120 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
29130 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
29140 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
29150 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
29160 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
29170 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
29180 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
29190 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
291a0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
291b0 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
291c0 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
291d0 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
291e0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
291f0 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
29200 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
29210 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
29220 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
29230 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
29240 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
29250 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
29260 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
29270 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
29280 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
29290 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
292a0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
292b0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
292c0 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
292d0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
292e0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
292f0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
29300 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
29310 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
29320 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
29330 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
29340 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
29350 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
29360 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
29370 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
29380 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
29390 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
293a0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
293b0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
293c0 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
293d0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
293e0 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
293f0 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
29400 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c  eak;.    elistFl
29410 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73  ags |= pE->flags
29420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
29430 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
29440 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
29450 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
29460 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
29470 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
29480 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
29490 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
294a0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
294b0 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
294c0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
294d0 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
294e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
294f0 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
29500 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
29510 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
29520 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
29530 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
29540 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
29550 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
29560 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
29570 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
29580 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
29590 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
295a0 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295c0 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
295d0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
295e0 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
295f0 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
29600 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
29610 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
29620 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74 46 6c  r;.      elistFl
29630 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73  ags |= pE->flags
29640 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
29650 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20   pE->pRight;.   
29660 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
29670 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
29680 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
29690 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
296a0 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26  STERISK.       &
296b0 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
296c0 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
296d0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20  =TK_ASTERISK).  
296e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
296f0 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
29700 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
29710 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
29720 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
29730 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
29740 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
29750 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
29760 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
29770 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
29780 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
29790 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
297a0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
297b0 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
297c0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
297d0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
297e0 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
297f0 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
29800 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
29810 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
29820 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
29830 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
29840 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
29850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
29860 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
29870 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
29880 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
29890 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
298a0 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
298b0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
298c0 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
298d0 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
298e0 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
298f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
29900 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20   *zTName = 0;   
29910 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
29920 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
29930 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
29940 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
29950 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29960 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pE->pLeft!=0 );.
29970 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29980 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
29990 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50  ty(pE->pLeft, EP
299a0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
299b0 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
299c0 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54   pE->pLeft->u.zT
299d0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oken;.        }.
299e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
299f0 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
29a00 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
29a10 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
29a20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
29a30 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
29a40 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
29a50 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
29a60 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
29a70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  t;.          cha
29a80 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
29a90 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
29aa0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
29ab0 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d  r *zSchemaName =
29ac0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
29ad0 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
29ae0 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
29af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29b00 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
29b10 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
29b20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
29b30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29b40 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
29b50 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d        if( pSub==
29b60 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46  0 || (pSub->selF
29b70 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
29b80 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  From)==0 ){.    
29b90 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30          pSub = 0
29ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29bb0 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
29bc0 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
29bd0 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
29be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29bf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
29c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29c10 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
29c20 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
29c30 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
29c40 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
29c50 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44  zSchemaName = iD
29c60 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b>=0 ? db->aDb[i
29c70 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22  Db].zDbSName : "
29c80 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  *";.          }.
29c90 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
29ca0 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
29cb0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
29cc0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
29cd0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
29ce0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
29cf0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
29d00 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
29d10 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
29d20 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
29d30 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
29d40 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
29d50 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
29d60 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
29d70 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
29d80 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
29d90 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
29da0 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
29db0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
29dc0 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  rt( zName );.   
29dd0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
29de0 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20  ame && pSub.    
29df0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
29e00 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
29e10 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61  (pSub->pEList->a
29e20 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54  [j].zSpan, 0, zT
29e30 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20  Name, 0)==0.    
29e40 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
29e50 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
29e60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
29e70 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
29e80 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
29e90 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
29ea0 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d  n', omit it from
29eb0 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
29ec0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
29ed0 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c  ult-set list unl
29ee0 65 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68  ess the SELECT h
29ef0 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64  as the SF_Includ
29f00 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20  eHidden.        
29f10 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a      ** bit set..
29f20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
29f30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
29f40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
29f50 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d  _IncludeHidden)=
29f60 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
29f70 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  && IsHiddenColum
29f80 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
29f90 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
29fa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29fb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
29fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29fd0 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
29fe0 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
29ff0 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
2a000 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2a010 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
2a020 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
2a030 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2a050 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
2a060 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
2a070 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
2a090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a0a0 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
2a0b0 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
2a0c0 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
2a0d0 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
2a0e0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
2a0f0 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
2a100 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
2a110 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2a120 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2a130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a140 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
2a150 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
2a160 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
2a170 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2a180 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
2a190 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
2a1a0 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
2a1b0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2a1d0 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
2a1e0 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
2a1f0 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2a210 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2a220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a240 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
2a250 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
2a260 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2a270 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
2a280 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2a290 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2a2b0 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
2a2c0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
2a2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
2a2e0 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
2a2f0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
2a300 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2a310 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
2a320 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2a330 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2a340 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2a350 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
2a360 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
2a370 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
2a380 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
2a390 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
2a3a0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
2a3b0 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
2a3c0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2a3d0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2a3e0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2a3f0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
2a400 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
2a410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a420 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
2a430 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
2a440 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
2a450 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2a460 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
2a470 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
2a480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a490 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
2a4a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
2a4b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a4d0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
2a4e0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
2a4f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a500 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2a510 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
2a520 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
2a530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2a540 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
2a550 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e  &sColname, zColn
2a560 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2a570 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2a580 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
2a590 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65   pNew, &sColname
2a5a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2a5b0 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70    if( pNew && (p
2a5c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2a5d0 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
2a5e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a5f0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2a600 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77  item *pX = &pNew
2a610 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
2a620 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
2a630 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20    if( pSub ){.  
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
2a650 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
2a660 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53  3DbStrDup(db, pS
2a670 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
2a680 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  .zSpan);.       
2a690 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2a6a0 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
2a6b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2a6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a6d0 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
2a6e0 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  n = sqlite3MPrin
2a6f0 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73  tf(db, "%s.%s.%s
2a700 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
2a730 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e  chemaName, zTabN
2a740 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
2a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a760 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
2a770 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
2a780 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a790 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61          pX->bSpa
2a7a0 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  nIsTab = 1;.    
2a7b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2a7d0 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29  ree(db, zToFree)
2a7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a800 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
2a810 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2a820 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
2a830 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2a840 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2a850 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
2a860 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
2a870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a880 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2a890 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2a8a0 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
2a8b0 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
2a8c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a8d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2a8e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a8f0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
2a900 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
2a910 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
2a920 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b  if( p->pEList ){
2a930 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  .    if( p->pELi
2a940 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
2a950 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2a960 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
2a970 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2a980 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
2a990 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
2a9a0 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
2a9b0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2a9c0 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bort;.    }.    
2a9d0 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67 73 20  if( (elistFlags 
2a9e0 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c 45 50  & (EP_HasFunc|EP
2a9f0 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30 20 29  _Subquery))!=0 )
2aa00 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c  {.      p->selFl
2aa10 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65  ags |= SF_Comple
2aa20 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20  xResult;.    }. 
2aa30 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2aa40 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2aa50 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
2aa60 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
2aa70 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
2aa80 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
2aa90 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
2aaa0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
2aab0 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
2aac0 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
2aad0 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
2aae0 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
2aaf0 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
2ab00 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
2ab10 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
2ab20 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2ab30 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
2ab40 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
2ab50 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
2ab60 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
2ab70 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
2ab80 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
2ab90 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
2aba0 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
2abb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2abc0 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
2abd0 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
2abe0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
2abf0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
2ac00 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
2ac10 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
2ac20 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2ac30 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
2ac40 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
2ac50 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53  ree walker for S
2ac60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
2ac70 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e  ..** subquery in
2ac80 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
2ac90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2aca0 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57  SelectWalkNoop(W
2acb0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2acc0 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
2acd0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2ace0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2acf0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
2ad00 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2ad10 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2ad20 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61  DEBUG./*.** Alwa
2ad30 79 73 20 61 73 73 65 72 74 2e 20 20 54 68 69 73  ys assert.  This
2ad40 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
2ad50 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  2 implementation
2ad60 20 70 72 6f 76 65 73 20 74 68 61 74 20 74 68 65   proves that the
2ad70 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  .** xSelectCallb
2ad80 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e  ack2 is never in
2ad90 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  voked..*/.void s
2ada0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
2adb0 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a  Assert2(Walker *
2adc0 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20  NotUsed, Select 
2add0 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
2ade0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
2adf0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
2ae00 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20  2);.  assert( 0 
2ae10 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a  );.}.#endif./*.*
2ae20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
2ae30 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
2ae40 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
2ae50 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
2ae60 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
2ae70 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
2ae80 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
2ae90 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
2aea0 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
2aeb0 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
2aec0 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
2aed0 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
2aee0 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
2aef0 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
2af00 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
2af10 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
2af20 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
2af30 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
2af40 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
2af50 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2af60 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
2af70 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
2af80 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
2af90 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
2afa0 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
2afb0 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
2afc0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
2afd0 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
2afe0 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
2aff0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
2b000 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
2b010 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
2b020 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
2b030 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
2b040 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b060 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2b070 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
2b080 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
2b090 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
2b0a0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2b0b0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2b0c0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2b0d0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2b0e0 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
2b0f0 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e  YS_TRUE(pParse->
2b100 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a  hasCompound) ){.
2b110 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
2b120 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
2b130 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
2b140 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e 78  ubquery;.    w.x
2b150 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2b160 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2b170 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
2b180 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
2b190 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2b1a0 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
2b1b0 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  r;.  w.xSelectCa
2b1c0 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
2b1d0 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74  PopWith;.  sqlit
2b1e0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
2b1f0 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
2b200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b210 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
2b220 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
2b230 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
2b240 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
2b250 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
2b260 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
2b270 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
2b280 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
2b290 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
2b2a0 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
2b2b0 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
2b2c0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
2b2d0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
2b2e0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
2b2f0 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
2b300 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
2b310 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
2b320 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
2b330 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
2b340 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
2b350 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
2b360 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
2b370 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
2b380 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
2b390 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
2b3a0 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
2b3b0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
2b3c0 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
2b3d0 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
2b3e0 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
2b3f0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
2b400 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
2b410 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
2b420 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2b430 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75  void selectAddSu
2b440 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
2b450 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2b460 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
2b470 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
2b480 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
2b490 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
2b4a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2b4b0 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
2b4c0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
2b4d0 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
2b4e0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
2b4f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
2b500 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a  TypeInfo)==0 );.
2b510 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2b520 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
2b530 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
2b540 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70  ker->pParse;.  p
2b550 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2b560 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  c;.  for(i=0, pF
2b570 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
2b580 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2b590 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
2b5a0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
2b5b0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
2b5c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
2b5d0 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
2b5e0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
2b5f0 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
2b600 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
2b610 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
2b620 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2b630 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
2b640 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
2b650 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
2b660 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
2b670 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
2b680 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
2b690 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
2b6a0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73  Prior;.        s
2b6b0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43  qlite3SelectAddC
2b6c0 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
2b6d0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
2b6e0 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  ab, pSel);.     
2b6f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
2b700 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
2b710 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
2b720 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
2b730 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2b740 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
2b750 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
2b760 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
2b770 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
2b780 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
2b790 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
2b7a0 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
2b7b0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
2b7c0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
2b7d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2b7e0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
2b7f0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
2b800 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
2b810 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
2b820 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2b830 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
2b840 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2b850 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
2b860 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  ctWalkNoop;.  w.
2b870 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2b880 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71   = selectAddSubq
2b890 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20  ueryTypeInfo;.  
2b8a0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2b8b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
2b8c0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
2b8d0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
2b8e0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2b8f0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
2b900 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
2b910 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
2b920 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
2b930 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
2b940 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
2b950 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
2b960 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
2b970 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
2b980 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
2b990 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
2b9a0 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
2b9b0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
2b9c0 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
2b9d0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
2b9e0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
2b9f0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
2ba00 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
2ba10 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
2ba20 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
2ba30 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
2ba40 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
2ba50 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
2ba60 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
2ba70 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
2ba80 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
2ba90 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
2baa0 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
2bab0 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
2bac0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bad0 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
2bae0 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
2baf0 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
2bb00 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
2bb10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
2bb20 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
2bb30 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
2bb40 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2bb50 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2bb60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2bb70 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2bb80 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
2bb90 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
2bba0 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
2bbb0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
2bbc0 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
2bbd0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
2bbe0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
2bbf0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
2bc00 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
2bc10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2bc20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2bc30 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2bc40 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
2bc50 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2bc60 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
2bc70 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
2bc80 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2bc90 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2bca0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2bcb0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
2bcc0 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
2bcd0 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
2bce0 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
2bcf0 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
2bd00 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2bd10 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
2bd20 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
2bd30 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
2bd40 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
2bd50 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
2bd60 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
2bd70 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
2bd80 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
2bd90 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
2bda0 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
2bdb0 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
2bdc0 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
2bdd0 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
2bde0 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
2bdf0 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
2be00 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
2be10 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
2be20 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
2be30 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
2be40 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
2be50 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
2be60 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2be70 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2be80 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2be90 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2bea0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
2beb0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
2bec0 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
2bed0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
2bee0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2bef0 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
2bf00 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
2bf10 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2bf20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
2bf30 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
2bf40 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
2bf50 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
2bf60 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
2bf70 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
2bf80 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
2bf90 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
2bfa0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
2bfb0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
2bfc0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2bfd0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2bfe0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2bff0 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
2c000 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
2c010 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
2c020 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
2c030 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
2c040 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
2c050 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
2c060 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2c070 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
2c080 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
2c090 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
2c0a0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2c0b0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2c0c0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2c0d0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2c0e0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
2c0f0 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
2c100 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
2c110 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
2c120 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
2c130 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
2c140 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
2c150 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
2c160 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2c170 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
2c180 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
2c190 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
2c1a0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
2c1b0 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
2c1c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2c1d0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
2c1e0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2c1f0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
2c200 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
2c210 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
2c220 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2c230 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2c240 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
2c250 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
2c260 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
2c270 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
2c280 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
2c290 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
2c2a0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
2c2b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
2c2c0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2c2d0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2c2e0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
2c2f0 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
2c300 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c310 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2c320 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2c330 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2c340 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2c370 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2c380 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c390 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
2c3a0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
2c3b0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
2c3c0 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
2c3d0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
2c3e0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
2c3f0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2c400 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
2c410 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
2c420 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2c430 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2c440 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2c450 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2c460 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2c470 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
2c480 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2c490 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2c4a0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2c4b0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
2c4c0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2c4d0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2c4e0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2c4f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2c500 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2c510 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2c520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c530 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
2c540 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
2c550 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
2c560 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  r : 0);.    sqli
2c570 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2c580 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2c590 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
2c5a0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
2c5b0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
2c5c0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
2c5d0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
2c5e0 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
2c5f0 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
2c600 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2c610 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
2c620 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
2c630 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2c640 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2c650 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2c660 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2c670 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
2c680 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
2c690 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
2c6a0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2c6b0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2c6c0 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
2c6d0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2c6e0 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
2c6f0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2c700 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2c710 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2c720 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
2c730 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
2c740 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
2c750 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
2c760 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2c770 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2c780 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2c790 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2c7a0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2c7b0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2c7c0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2c7d0 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
2c7e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
2c7f0 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
2c800 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2c810 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
2c820 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2c830 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2c840 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
2c850 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   0, SQLITE_ECEL_
2c860 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
2c870 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
2c880 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2c890 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2c8a0 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
2c8b0 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
2c8c0 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
2c8d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2c8e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2c8f0 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72  Arg==0 );  /* Er
2c900 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  ror condition */
2c910 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c920 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20   nArg>1 );   /* 
2c930 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f  Also an error */
2c940 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
2c950 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
2c960 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
2c970 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
2c980 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2c990 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
2c9a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
2c9b0 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
2c9c0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
2c9d0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
2c9e0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2c9f0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
2ca00 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
2ca10 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
2ca20 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
2ca30 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
2ca40 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
2ca50 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
2ca60 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
2ca70 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
2ca80 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2ca90 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2caa0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2cab0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
2cac0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
2cad0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2cae0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2caf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
2cb00 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
2cb10 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
2cb20 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
2cb30 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
2cb40 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
2cb50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2cb60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2cb70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
2cb80 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
2cb90 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
2cba0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
2cbb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2cbc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  AddOp3(v, OP_Agg
2cbd0 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67  Step0, 0, regAgg
2cbe0 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  , pF->iMem);.   
2cbf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2cc00 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2cc10 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2cc20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2cc30 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
2cc40 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2cc50 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
2cc60 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
2cc70 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
2cc80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2cc90 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
2cca0 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
2ccb0 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
2ccc0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
2ccd0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2cce0 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
2ccf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2cd00 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2cd10 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
2cd20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
2cd30 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
2cd40 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
2cd50 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
2cd60 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
2cd70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
2cd80 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
2cd90 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
2cda0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
2cdb0 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
2cdc0 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
2cdd0 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
2cde0 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
2cdf0 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
2ce00 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
2ce10 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
2ce20 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
2ce30 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
2ce40 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
2ce50 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
2ce60 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
2ce70 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
2ce80 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
2ce90 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
2cea0 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
2ceb0 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
2cec0 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
2ced0 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
2cee0 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
2cef0 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
2cf00 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
2cf10 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
2cf20 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
2cf30 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
2cf40 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
2cf50 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
2cf60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
2cf70 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
2cf80 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
2cf90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2cfa0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2cfb0 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
2cfc0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
2cfd0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2cfe0 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
2cff0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
2d000 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2d010 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
2d020 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
2d030 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2d040 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
2d050 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2d060 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
2d070 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
2d080 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2d090 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
2d0a0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
2d0b0 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
2d0c0 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
2d0d0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
2d0e0 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
2d0f0 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
2d100 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
2d110 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
2d120 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
2d130 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2d140 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
2d150 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
2d160 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
2d170 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
2d180 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
2d190 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
2d1a0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
2d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d1c0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
2d1d0 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
2d1e0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
2d1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2d200 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
2d210 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
2d220 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
2d230 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2d240 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
2d250 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
2d260 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
2d270 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
2d280 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
2d290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
2d2a0 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c 20 30  xplain(pParse, 0
2d2b0 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73  , "SCAN TABLE %s
2d2c0 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  %s%s",.        p
2d2d0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
2d2e0 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55      bCover ? " U
2d2f0 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
2d300 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  DEX " : "",.    
2d310 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64      bCover ? pId
2d320 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20  x->zName : "".  
2d330 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
2d340 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
2d350 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
2d360 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
2d370 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  * sqlite3WalkExp
2d380 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  r() callback use
2d390 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65  d by havingToWhe
2d3a0 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re()..**.** If t
2d3b0 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74  he node passed t
2d3c0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69  o the callback i
2d3d0 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c  s a TK_AND node,
2d3e0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f   return .** WRC_
2d3f0 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c  Continue to tell
2d400 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2d410 28 29 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  () to iterate th
2d420 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65  rough child node
2d430 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
2d440 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50  se, return WRC_P
2d450 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61  rune. In this ca
2d460 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69  se, also check i
2d470 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78  f the .** sub-ex
2d480 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73  pression matches
2d490 20 74 68 65 20 63 72 69 74 65 72 69 61 20 66 6f   the criteria fo
2d4a0 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  r being moved to
2d4b0 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c   the WHERE.** cl
2d4c0 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64  ause. If so, add
2d4d0 20 69 74 20 74 6f 20 74 68 65 20 57 48 45 52 45   it to the WHERE
2d4e0 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c   clause and repl
2d4f0 61 63 65 20 74 68 65 20 73 75 62 2d 65 78 70 72  ace the sub-expr
2d500 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e  ession.** within
2d510 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72   the HAVING expr
2d520 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f  ession with a co
2d530 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73  nstant "1"..*/.s
2d540 74 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67  tatic int having
2d550 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 57 61  ToWhereExprCb(Wa
2d560 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2d570 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
2d580 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
2d590 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c 65  _AND ){.    Sele
2d5a0 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65 72  ct *pS = pWalker
2d5b0 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->u.pSelect;.   
2d5c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2d5d0 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
2d5e0 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61  pBy(pWalker->pPa
2d5f0 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 2d 3e  rse, pExpr, pS->
2d600 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20  pGroupBy) ){.   
2d610 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
2d620 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2d630 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72  ->db;.      Expr
2d640 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
2d650 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
2d660 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
2d670 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
2d680 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
2d690 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  ew ){.        Ex
2d6a0 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70 53 2d  pr *pWhere = pS-
2d6b0 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 20  >pWhere;.       
2d6c0 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65   SWAP(Expr, *pNe
2d6d0 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20  w, *pExpr);.    
2d6e0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2d6f0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57  e3ExprAnd(db, pW
2d700 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
2d710 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72 65 20       pS->pWhere 
2d720 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
2d730 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2d740 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2d750 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  }.    return WRC
2d760 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65  _Prune;.  }.  re
2d770 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2d780 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  e;.}../*.** Tran
2d790 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65  sfer eligible te
2d7a0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56  rms from the HAV
2d7b0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
2d7c0 71 75 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a  query, which is.
2d7d0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66 74  ** processed aft
2d7e0 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20  er grouping, to 
2d7f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2d800 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f 63 65  , which is proce
2d810 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67  ssed before.** g
2d820 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61  rouping. For exa
2d830 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a  mple, the query:
2d840 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
2d850 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20  * FROM <tables> 
2d860 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20  WHERE a=? GROUP 
2d870 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20  BY b HAVING b=? 
2d880 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61  AND c=?.**.** ca
2d890 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
2d8a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  s:.**.**   SELEC
2d8b0 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73  T * FROM <tables
2d8c0 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  > WHERE a=? AND 
2d8d0 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48  b=? GROUP BY b H
2d8e0 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20  AVING c=?.**.** 
2d8f0 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41  A term of the HA
2d900 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2d910 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20  is eligible for 
2d920 74 72 61 6e 73 66 65 72 20 69 66 20 69 74 20 63  transfer if it c
2d930 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72  onsists.** entir
2d940 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73  ely of constants
2d950 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73   and expressions
2d960 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47   that are also G
2d970 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74 68  ROUP BY terms th
2d980 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42  at.** use the "B
2d990 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e  INARY" collation
2d9a0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
2d9b0 61 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67  atic void having
2d9c0 54 6f 57 68 65 72 65 28 50 61 72 73 65 20 2a 70  ToWhere(Parse *p
2d9d0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
2d9e0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c  ){.  Walker sWal
2d9f0 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ker;.  memset(&s
2da00 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Walker, 0, sizeo
2da10 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73  f(sWalker));.  s
2da20 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20  Walker.pParse = 
2da30 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65  pParse;.  sWalke
2da40 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
2da50 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45  = havingToWhereE
2da60 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72  xprCb;.  sWalker
2da70 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a  .u.pSelect = p;.
2da80 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2da90 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e 70  r(&sWalker, p->p
2daa0 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53 45 4c  Having);.#if SEL
2dab0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2dac0 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65  .  if( sWalker.e
2dad0 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74 65 33  Code && (sqlite3
2dae0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2daf0 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 53  100)!=0 ){.    S
2db00 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
2db10 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76 65  ,pParse,p,("Move
2db20 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20 69 6e   HAVING terms in
2db30 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b 0a  to WHERE:\n"));.
2db40 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2db50 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2db60 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  0);.  }.#endif.}
2db70 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
2db80 20 73 65 65 20 69 66 20 74 68 65 20 70 54 68 69   see if the pThi
2db90 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c  s entry of pTabL
2dba0 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f  ist is a self-jo
2dbb0 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69  in of a prior vi
2dbc0 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c  ew..** If it is,
2dbd0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
2dbe0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f   SrcList_item fo
2dbf0 72 20 74 68 65 20 70 72 69 6f 72 20 76 69 65 77  r the prior view
2dc00 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
2dc10 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
2dc20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  0..*/.static str
2dc30 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2dc40 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77   *isSelfJoinView
2dc50 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
2dc60 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
2dc70 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73   /* Search for s
2dc80 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69  elf-joins in thi
2dc90 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  s FROM clause */
2dca0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2dcb0 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20  t_item *pThis   
2dcc0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 72  /* Search for pr
2dcd0 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ior reference to
2dce0 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20 2a   this subquery *
2dcf0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
2dd00 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2dd10 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d  m;.  for(pItem =
2dd20 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49   pTabList->a; pI
2dd30 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d  tem<pThis; pItem
2dd40 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  ++){.    if( pIt
2dd50 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  em->pSelect==0 )
2dd60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2dd70 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
2dd80 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74  Coroutine ) cont
2dd90 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
2dda0 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20  tem->zName==0 ) 
2ddb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2ddc0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2ddd0 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  p(pItem->zDataba
2dde0 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61  se, pThis->zData
2ddf0 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  base)!=0 ) conti
2de00 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
2de10 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74  ite3_stricmp(pIt
2de20 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73  em->zName, pThis
2de30 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f  ->zName)!=0 ) co
2de40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2de50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2de60 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20  re(0, .         
2de70 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d   pThis->pSelect-
2de80 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
2de90 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c  pSelect->pWhere,
2dea0 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20   -1) .    ){.   
2deb0 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77     /* The view w
2dec0 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73  as modified by s
2ded0 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ome other optimi
2dee0 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20  zation such as. 
2def0 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e       ** pushDown
2df00 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a  WhereTerms() */.
2df10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2df20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2df30 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65   pItem;.  }.  re
2df40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
2df50 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
2df60 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2df70 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  N./*.** Attempt 
2df80 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71  to transform a q
2df90 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
2dfa0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2dfb0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28   count(*) FROM (
2dfc0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
2dfd0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
2dfe0 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a  T y FROM t2).**.
2dff0 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a  ** Into this:.**
2e000 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53  .**    SELECT (S
2e010 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2e020 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20  ROM t1)+(SELECT 
2e030 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
2e040 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ).**.** The tran
2e050 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20  sformation only 
2e060 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20  works if all of 
2e070 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
2e080 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
2e090 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  *  The subquery 
2e0a0 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  is a UNION ALL o
2e0b0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  f two or more te
2e0c0 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72  rms.**   *  Ther
2e0d0 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72  e is no WHERE or
2e0e0 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
2e0f0 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74  ING clauses on t
2e100 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  he subqueries.**
2e110 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20     *  The outer 
2e120 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
2e130 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a  e count(*).**.**
2e140 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2e150 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2e160 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a   is undertaken..
2e170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2e180 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a  untOfViewOptimiz
2e190 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
2e1a0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
2e1b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c  .  Select *pSub,
2e1c0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72   *pPrior;.  Expr
2e1d0 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20   *pExpr;.  Expr 
2e1e0 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74  *pCount;.  sqlit
2e1f0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70  e3 *db;.  if( (p
2e200 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2e210 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20  Aggregate)==0 ) 
2e220 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54  return 0;   /* T
2e230 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65 67  his is an aggreg
2e240 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ate */.  if( p->
2e250 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
2e260 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2e270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2e280 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
2e290 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20  mn */.  pExpr = 
2e2a0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
2e2b0 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
2e2c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
2e2d0 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
2e2e0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65   0;        /* Re
2e2f0 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65  sult is an aggre
2e300 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71  gate */.  if( sq
2e310 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45  lite3_stricmp(pE
2e320 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63  xpr->u.zToken,"c
2e330 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20  ount") ) return 
2e340 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28  0;  /* Is count(
2e350 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  ) */.  if( pExpr
2e360 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72  ->x.pList!=0 ) r
2e370 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2e380 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2e390 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a   be count(*) */.
2e3a0 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e    if( p->pSrc->n
2e3b0 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
2e3c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e3d0 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65      /* One table
2e3e0 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70   in FROM  */.  p
2e3f0 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
2e400 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  [0].pSelect;.  i
2e410 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74  f( pSub==0 ) ret
2e420 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e440 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20   /* The FROM is 
2e450 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
2e460 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
2e470 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e490 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63    /* Must be a c
2e4a0 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20  ompound ry */.  
2e4b0 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62  do{.    if( pSub
2e4c0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20  ->op!=TK_ALL && 
2e4d0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72  pSub->pPrior ) r
2e4e0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73  eturn 0;  /* Mus
2e4f0 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a  t be UNION ALL *
2e500 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
2e510 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
2e520 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e530 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48          /* No WH
2e540 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2e550 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
2e560 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2e570 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ate ) return 0; 
2e580 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67      /* Not an ag
2e590 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70  gregate */.    p
2e5a0 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  Sub = pSub->pPri
2e5b0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5d0 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20   /* Repeat over 
2e5e0 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77  compound */.  }w
2e5f0 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20  hile( pSub );.. 
2e600 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
2e610 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20  this point then 
2e620 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66  it is OK to perf
2e630 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72  orm the transfor
2e640 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20  mation */..  db 
2e650 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2e660 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a  pCount = pExpr;.
2e670 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70    pExpr = 0;.  p
2e680 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
2e690 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70  [0].pSelect;.  p
2e6a0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2e6b0 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lect = 0;.  sqli
2e6c0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
2e6d0 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
2e6e0 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74   p->pSrc = sqlit
2e6f0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
2e700 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
2e710 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20  f(*p->pSrc));.  
2e720 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20  while( pSub ){. 
2e730 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a     Expr *pTerm;.
2e740 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75      pPrior = pSu
2e750 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  b->pPrior;.    p
2e760 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  Sub->pPrior = 0;
2e770 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74  .    pSub->pNext
2e780 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e   = 0;.    pSub->
2e790 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
2e7a0 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53  ggregate;.    pS
2e7b0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20  ub->selFlags &= 
2e7c0 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
2e7d0 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52    pSub->nSelectR
2e7e0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ow = 0;.    sqli
2e7f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2e800 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  e(db, pSub->pELi
2e810 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  st);.    pTerm =
2e820 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65   pPrior ? sqlite
2e830 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f  3ExprDup(db, pCo
2e840 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74  unt, 0) : pCount
2e850 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69  ;.    pSub->pELi
2e860 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
2e870 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
2e880 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20  e, 0, pTerm);.  
2e890 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
2e8a0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2e8b0 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b  K_SELECT, 0, 0);
2e8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70  .    sqlite3PExp
2e8d0 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73  rAddSelect(pPars
2e8e0 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b  e, pTerm, pSub);
2e8f0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d  .    if( pExpr==
2e900 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2e910 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65   = pTerm;.    }e
2e920 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72  lse{.      pExpr
2e930 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2e940 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c  pParse, TK_PLUS,
2e950 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a   pTerm, pExpr);.
2e960 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d      }.    pSub =
2e970 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70   pPrior;.  }.  p
2e980 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
2e990 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2e9a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2e9b0 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23  SF_Aggregate;..#
2e9c0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2e9d0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2e9e0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2e9f0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
2ea00 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2ea10 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2ea20 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20  r count-of-view 
2ea30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22  optimization:\n"
2ea40 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2ea50 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2ea60 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2ea70 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  if.  return 1;.}
2ea80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2ea90 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2eaa0 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  TIMIZATION */../
2eab0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2eac0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
2ead0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
2eae0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
2eaf0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
2eb00 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74   results are ret
2eb10 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20  urned according 
2eb20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  to the SelectDes
2eb30 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  t structure..** 
2eb40 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  See comments in 
2eb50 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20  sqliteInt.h for 
2eb60 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74  further informat
2eb70 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
2eb80 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2eb90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2eba0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
2ebb0 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
2ebc0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
2ebd0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
2ebe0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
2ebf0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
2ec00 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
2ec10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2ec20 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
2ec30 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
2ec40 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
2ec50 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
2ec60 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
2ec70 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
2ec80 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
2ec90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2eca0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2ecb0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2ecc0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
2ecd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
2ece0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
2ecf0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
2ed00 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
2ed10 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
2ed20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
2ed30 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
2ed40 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2ed60 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2ed70 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2ed80 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
2ed90 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
2eda0 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
2edb0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
2edc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
2edd0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
2ede0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2edf0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
2ee00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2ee10 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
2ee20 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
2ee30 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
2ee40 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30  List *pEList = 0
2ee50 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f  ;  /* List of co
2ee60 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
2ee70 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
2ee80 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
2ee90 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2eea0 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
2eeb0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
2eec0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
2eed0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2eee0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2eef0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
2ef00 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
2ef10 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
2ef20 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
2ef30 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
2ef40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2ef50 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
2ef60 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2ef70 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
2ef80 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
2ef90 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
2efa0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2efb0 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
2efc0 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e  sDistinct; /* In
2efd0 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
2efe0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
2eff0 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74  eyword */.  Sort
2f000 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20  Ctx sSort;      
2f010 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f     /* Info on ho
2f020 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52  w to code the OR
2f030 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2f040 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
2f050 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
2f060 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
2f070 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
2f080 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
2f090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2f0a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
2f0b0 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
2f0c0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
2f0d0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
2f0e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
2f0f0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
2f100 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f  prList *pMinMaxO
2f110 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20  rderBy = 0;  /* 
2f120 41 64 64 65 64 20 4f 52 44 45 52 20 42 59 20 66  Added ORDER BY f
2f130 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69  or min/max queri
2f140 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61  es */.  u8 minMa
2f150 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20  xFlag;          
2f160 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 66         /* Flag f
2f170 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69  or min/max queri
2f180 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50  es */..  db = pP
2f190 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
2f1a0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
2f1b0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Parse);.  if( p=
2f1c0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
2f1d0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
2f1e0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
2f1f0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2f200 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
2f210 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
2f220 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
2f230 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
2f240 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
2f250 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
2f260 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c  gInfo));.#if SEL
2f270 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2f280 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
2f290 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67  ,pParse,p, ("beg
2f2a0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e  in processing:\n
2f2b0 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45  ", pParse->addrE
2f2c0 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28 20  xplain));.  if( 
2f2d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2f2e0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2f2f0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2f300 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2f310 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2f320 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2f330 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2f340 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
2f350 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2f360 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2f370 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2f380 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  !=SRT_Fifo );.  
2f390 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2f3a0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2f3b0 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
2f3c0 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72  Queue );.  asser
2f3d0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2f3e0 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2f3f0 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a  t!=SRT_Queue );.
2f400 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
2f410 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
2f420 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
2f430 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
2f440 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
2f450 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
2f460 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
2f470 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2f480 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
2f490 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2f4a0 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20  card ||.        
2f4b0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2f4c0 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70  =SRT_Queue  || p
2f4d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2f4e0 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20  _DistFifo ||.   
2f4f0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2f500 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
2f510 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  eue || pDest->eD
2f520 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a  est==SRT_Fifo);.
2f530 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
2f540 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
2f550 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
2f560 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
2f570 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
2f580 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
2f590 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
2f5a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
2f5b0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2f5c0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
2f5d0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
2f5e0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
2f5f0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2f600 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
2f610 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
2f620 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d  arse, p, 0);.  m
2f630 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c  emset(&sSort, 0,
2f640 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b   sizeof(sSort));
2f650 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  .  sSort.pOrderB
2f660 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2f670 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2f680 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61  >pSrc;.  if( pPa
2f690 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
2f6a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2f6b0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
2f6c0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _end;.  }.  asse
2f6d0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
2f6e0 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70   );.  isAgg = (p
2f6f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2f700 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23  Aggregate)!=0;.#
2f710 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2f720 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2f730 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2f740 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53  & 0x104 ){.    S
2f750 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34  ELECTTRACE(0x104
2f760 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
2f770 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
2f780 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
2f790 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2f7a0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2f7b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
2f7c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2f7d0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
2f7e0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
2f7f0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
2f800 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f    }..  /* Try to
2f810 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
2f820 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69  ations (flatteni
2f830 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c 20 61  ng subqueries, a
2f840 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a  nd strength.  **
2f850 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f   reduction of jo
2f860 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e  in operators) in
2f870 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2f880 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   up into the mai
2f890 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66  n query.  */.#if
2f8a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2f8b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2f8c0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2f8d0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2f8e0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
2f8f0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
2f900 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2f910 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2f920 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2f930 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
2f940 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
2f950 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2f960 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ct;.    Table *p
2f970 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
2f980 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  b;..    /* Conve
2f990 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74  rt LEFT JOIN int
2f9a0 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20  o JOIN if there 
2f9b0 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  are terms of the
2f9c0 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20   right table.   
2f9d0 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20   ** of the LEFT 
2f9e0 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65  JOIN used in the
2f9f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
2fa00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
2fa10 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
2fa20 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
2fa30 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
2fa40 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c  xprImpliesNonNul
2fa50 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20  lRow(p->pWhere, 
2fa60 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a  pItem->iCursor).
2fa70 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
2fa80 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
2fa90 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a  SQLITE_SimplifyJ
2faa0 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  oin).    ){.    
2fab0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2fac0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
2fae0 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69  LEFT-JOIN simpli
2faf0 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20  fies to JOIN on 
2fb00 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a  term %d\n",i));.
2fb10 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
2fb20 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54  jointype &= ~(JT
2fb30 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b  _LEFT|JT_OUTER);
2fb40 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e  .      unsetJoin
2fb50 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
2fb60 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2fb70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
2fb80 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20  o futher action 
2fb90 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20  if this term of 
2fba0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2fbb0 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79  is no a subquery
2fbc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
2fbd0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2fbe0 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69  .    /* Catch mi
2fbf0 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65  smatch in the de
2fc00 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f  clared columns o
2fc10 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  f a view and the
2fc20 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
2fc30 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * columns in the
2fc40 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52   SELECT on the R
2fc50 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  HS */.    if( pT
2fc60 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e  ab->nCol!=pSub->
2fc70 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
2fc80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2fc90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2fca0 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
2fcb0 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74  mns for '%s' but
2fcc0 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20   got %d",.      
2fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fce0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
2fcf0 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70  ->zName, pSub->p
2fd00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
2fd10 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
2fd20 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
2fd30 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74   /* Do not try t
2fd40 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67  o flatten an agg
2fd50 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e  regate subquery.
2fd60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
2fd70 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67  lattening an agg
2fd80 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 20  regate subquery 
2fd90 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
2fda0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
2fdb0 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ery.    ** is no
2fdc0 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69  t a join.  But i
2fdd0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
2fde0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c  y is not a join,
2fdf0 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   then the subque
2fe00 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  ry.    ** will b
2fe10 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  e implemented as
2fe20 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e   a co-routine an
2fe30 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64  d there is no ad
2fe40 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a  vantage to.    *
2fe50 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  * flattening in 
2fe60 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
2fe70 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d  /.    if( (pSub-
2fe80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2fe90 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20 63  ggregate)!=0 ) c
2fea0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
2feb0 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75  ert( pSub->pGrou
2fec0 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  pBy==0 );..    /
2fed0 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  * If the outer q
2fee0 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  uery contains a 
2fef0 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74  "complex" result
2ff00 20 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20   set (that is,. 
2ff10 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73     ** if the res
2ff20 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
2ff30 75 74 65 72 20 71 75 65 72 79 20 75 73 65 73 20  uter query uses 
2ff40 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62  functions or sub
2ff50 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20  queries).    ** 
2ff60 61 6e 64 20 69 66 20 74 68 65 20 73 75 62 71 75  and if the subqu
2ff70 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ery contains an 
2ff80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ff90 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  and if.    ** it
2ffa0 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65   will be impleme
2ffb0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
2ffc0 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  tine, then do no
2ffd0 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73  t flatten.  This
2ffe0 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74  .    ** restrict
2fff0 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63  ion allows SQL c
30000 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74  onstructs like t
30010 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
30020 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e  **  SELECT expen
30030 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29  sive_function(x)
30040 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20  .    **    FROM 
30050 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
30060 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49  ab ORDER BY y LI
30070 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a  MIT 10);.    **.
30080 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e      ** The expen
30090 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  sive_function() 
300a0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64  is only computed
300b0 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20   on the 10 rows 
300c0 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20  that.    ** are 
300d0 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74  output, rather t
300e0 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66  han every row of
300f0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
30100 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
30110 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
30120 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
30130 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65  ave a complex re
30140 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20  sult set.    ** 
30150 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74  means that flatt
30160 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72  ening does occur
30170 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20   on simpler SQL 
30180 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68  constraints with
30190 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  out.    ** the e
301a0 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f  xpensive_functio
301b0 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a  n() like:.    **
301c0 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20  .    **  SELECT 
301d0 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  x FROM (SELECT x
301e0 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
301f0 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
30200 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30210 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  Sub->pOrderBy!=0
30220 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20  .     && i==0.  
30230 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61     && (p->selFla
30240 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52  gs & SF_ComplexR
30250 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26  esult)!=0.     &
30260 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
30270 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  c==1.         ||
30280 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
30290 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
302a0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
302b0 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
302c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
302d0 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  }..    if( flatt
302e0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
302f0 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20  e, p, i, isAgg) 
30300 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
30310 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
30320 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
30330 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
30340 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
30350 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
30360 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
30370 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
30380 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
30390 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49  _end;.    if( !I
303a0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
303b0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
303c0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
303d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
303e0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
303f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30400 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
30410 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20  ECT.  /* Handle 
30420 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
30430 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67  statements using
30440 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75   the separate mu
30450 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a  ltiSelect().  **
30460 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f   procedure..  */
30470 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
30480 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
30490 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
304a0 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20   p, pDest);.#if 
304b0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
304c0 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
304d0 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70  ACE(0x1,pParse,p
304e0 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d  ,("end compound-
304f0 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
30500 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20  g\n"));.    if( 
30510 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72  (sqlite3SelectTr
30520 61 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30  ace & 0x2000)!=0
30530 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79   && ExplainQuery
30540 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73  PlanParent(pPars
30550 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
30560 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
30570 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
30580 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
30590 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  if( p->pNext==0 
305a0 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ) ExplainQueryPl
305b0 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
305c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
305d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46  }.#endif..  /* F
305e0 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  or each term in 
305f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
30600 20 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a   do two things:.
30610 20 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69    ** (1) Authori
30620 7a 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64  zed unreferenced
30630 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29   tables.  ** (2)
30640 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
30650 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
30660 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  es.  */.  for(i=
30670 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
30680 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
30690 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
306a0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
306b0 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  bList->a[i];.   
306c0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
306d0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
306e0 75 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ub;.#if !defined
306f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
30700 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
30710 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
30720 49 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63  IEW).    const c
30730 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
30740 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a  ontext;.#endif..
30750 20 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c      /* Issue SQL
30760 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
30770 7a 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66  zations with a f
30780 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
30790 66 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74  for any.    ** t
307a0 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72  ables that are r
307b0 65 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72  eferenced but fr
307c0 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75  om which no valu
307d0 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  es are extracted
307e0 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  ..    ** Example
307f0 73 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65  s of where these
30800 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53   kinds of null S
30810 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f  QLITE_READ autho
30820 72 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  rizations.    **
30830 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20   would occur:.  
30840 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
30850 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
30860 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51  FROM t1;   -- SQ
30870 4c 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a  LITE_READ t1."".
30880 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
30890 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20  T t1.* FROM t1, 
308a0 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f  t2;   -- SQLITE_
308b0 52 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a  READ t2."".    *
308c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b  *.    ** The fak
308d0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
308e0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
308f0 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
30900 65 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f  e for a table to
30910 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63  .    ** have a c
30920 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74  olumn named by t
30930 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  he empty string,
30940 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
30950 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
30960 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67  o.    ** disting
30970 75 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20  uish between an 
30980 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  unreferenced tab
30990 6c 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c  le and an actual
309a0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
309b0 65 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75  e.    ** "" colu
309c0 6d 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  mn. The original
309d0 20 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20   design was for 
309e0 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  the fake column 
309f0 6e 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c  name to be a NUL
30a00 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  L,.    ** which 
30a10 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67  would be unambig
30a20 75 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63  uous.  But legac
30a30 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  y authorization 
30a40 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a  callbacks might.
30a50 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68      ** assume th
30a60 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
30a70 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65   non-NULL and se
30a80 67 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65  gfault.  The use
30a90 20 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20   of an empty.   
30aa0 20 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74   ** string for t
30ab0 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
30ac0 61 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e  ame seems safer.
30ad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30ae0 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d  pItem->colUsed==
30af0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
30b00 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
30b10 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c  se, SQLITE_READ,
30b20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22   pItem->zName, "
30b30 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  ", pItem->zDatab
30b40 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  ase);.    }..#if
30b50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
30b60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
30b70 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
30b80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
30b90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
30ba0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
30bb0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
30bc0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f  OM clause.    */
30bd0 0a 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65  .    pSub = pIte
30be0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
30bf0 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
30c00 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
30c10 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f  Sometimes the co
30c20 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72  de for a subquer
30c30 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  y will be genera
30c40 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ted more than.  
30c50 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68    ** once, if th
30c60 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61  e subquery is pa
30c70 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rt of the WHERE 
30c80 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54  clause in a LEFT
30c90 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f   JOIN,.    ** fo
30ca0 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74  r example.  In t
30cb0 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74  hat case, do not
30cc0 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20   regenerate the 
30cd0 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  code to manifest
30ce0 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f  .    ** a view o
30cf0 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  r the co-routine
30d00 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
30d10 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74  view.  The first
30d20 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a   instance.    **
30d30 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20   is sufficient, 
30d40 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f  though the subro
30d50 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73  utine to manifes
30d60 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20  t the view does 
30d70 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
30d80 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e  e invoked again.
30d90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
30da0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29  m->addrFillSub )
30db0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
30dc0 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
30dd0 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ne==0 ){.       
30de0 20 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69   /* The subrouti
30df0 6e 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74  ne that manifest
30e00 73 20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74  s the view might
30e10 20 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72   be a one-time r
30e20 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  outine,.        
30e30 2a 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e  ** or it might n
30e40 65 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20  eed to be rerun 
30e50 6f 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f  on each iteratio
30e60 6e 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20  n because it.   
30e70 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20       ** encodes 
30e80 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
30e90 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20  query. */.      
30ea0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
30eb0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
30ec0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
30ed0 75 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  ub)->opcode==OP_
30ee0 4f 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Once );.        
30ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30f00 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
30f10 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
30f20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
30f30 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
30f40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
30f50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
30f60 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
30f70 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
30f80 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
30f90 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
30fa0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
30fb0 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
30fc0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
30fd0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
30fe0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
30ff0 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
31000 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
31010 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
31020 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
31030 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
31040 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
31050 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
31060 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
31070 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
31080 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
31090 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
310a0 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
310b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
310c0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
310d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
310e0 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
310f0 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   /* Make copies 
31100 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52  of constant WHER
31110 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69  E-clause terms i
31120 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
31130 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e  y down.    ** in
31140 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72  side the subquer
31150 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c  y.  This can hel
31160 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  p the subquery t
31170 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63  o run more effic
31180 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iently..    */. 
31190 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
311a0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
311b0 51 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a  QLITE_PushDown).
311c0 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e       && pushDown
311d0 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
311e0 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65  e, pSub, p->pWhe
311f0 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  re, pItem->iCurs
31200 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
31210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
31220 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
31230 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
31240 30 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  0).    ){.#if SE
31250 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
31260 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
31270 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
31280 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
31290 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
312a0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
312b0 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73  fter WHERE-claus
312c0 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29  e push-down:\n")
312d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
312e0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
312f0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
31300 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
31310 6c 73 65 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  lse{.      SELEC
31320 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
31330 72 73 65 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77  rse,p,("Push-dow
31340 6e 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e  n not possible\n
31350 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  "));.    }..    
31360 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
31370 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
31380 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50  hContext;.    pP
31390 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
313a0 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  xt = pItem->zNam
313b0 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  e;..    /* Gener
313c0 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  ate code to impl
313d0 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65  ement the subque
313e0 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ry.    **.    **
313f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
31400 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
31410 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20  a co-routine if 
31420 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a  the subquery is.
31430 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
31440 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65  d to be the oute
31450 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20  r loop (so that 
31460 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  it does not need
31470 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f   to be.    ** co
31480 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  mputed more than
31490 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20   once).    **.  
314a0 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74    ** TODO: Are t
314b0 68 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f  here other reaso
314c0 6e 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f  ns beside (1) to
314d0 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e   use a co-routin
314e0 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65  e.    ** impleme
314f0 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a  ntation?.    */.
31500 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20      if( i==0.   
31510 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e    && (pTabList->
31520 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
31530 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
31540 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
31550 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
31560 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28  ROSS))!=0)  /* (
31570 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  1) */.    ){.   
31580 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20     /* Implement 
31590 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
315a0 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  t will return a 
315b0 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
315c0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
315d0 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e  * set on each in
315e0 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  vocation..      
315f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
31600 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
31610 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
31620 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  +1;.     .      
31630 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
31640 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
31650 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
31660 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
31670 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
31680 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
31690 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
316a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
316b0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
316c0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
316d0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
316e0 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
316f0 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
31700 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
31710 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
31720 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
31730 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
31740 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
31750 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f  ((pParse, 1, "CO
31760 2d 52 4f 55 54 49 4e 45 20 30 78 25 70 22 2c 20  -ROUTINE 0x%p", 
31770 70 53 75 62 29 29 3b 0a 20 20 20 20 20 20 45 78  pSub));.      Ex
31780 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 53 65  plainQueryPlanSe
31790 74 49 64 28 70 50 61 72 73 65 2c 20 70 53 75 62  tId(pParse, pSub
317a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
317b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
317c0 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
317d0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
317e0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
317f0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
31800 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76       pItem->fg.v
31810 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
31820 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
31830 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
31840 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
31850 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
31860 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65  ine(v, pItem->re
31870 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
31880 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
31890 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
318a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
318b0 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
318c0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
318d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
318e0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
318f0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
31900 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
31910 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
31920 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
31930 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
31940 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
31950 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
31960 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
31970 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
31980 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
31990 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
319a0 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
319b0 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
319c0 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
319d0 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
319e0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
319f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31a00 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
31a10 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
31a20 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
31a30 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74 72  tAddr;.      str
31a40 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
31a50 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20 20   *pPrior;..     
31a60 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
31a70 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
31a80 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
31a90 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
31aa0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
31ab0 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
31ac0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31ad0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
31ae0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
31af0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
31b00 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
31b10 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
31b20 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
31b30 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
31b40 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
31b50 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
31b60 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
31b70 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
31b80 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
31b90 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
31ba0 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
31bb0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
31bc0 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
31bd0 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
31be0 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
31bf0 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
31c00 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
31c10 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
31c20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
31c30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
31c40 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
31c50 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
31c60 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
31c70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31c80 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
31c90 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
31ca0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
31cb0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
31cc0 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
31cd0 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65     pPrior = isSe
31ce0 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c  lfJoinView(pTabL
31cf0 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20  ist, pItem);.   
31d00 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b     if( pPrior ){
31d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31d20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
31d30 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d  _OpenDup, pItem-
31d40 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72  >iCursor, pPrior
31d50 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
31d60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
31d70 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  or->pSelect!=0 )
31d80 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
31d90 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
31da0 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e 53  ior->pSelect->nS
31db0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
31dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
31dd0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
31de0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
31df0 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
31e00 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
31e10 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
31e20 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
31e30 22 4d 41 54 45 52 49 41 4c 49 5a 45 20 30 78 25  "MATERIALIZE 0x%
31e40 70 22 2c 20 70 53 75 62 29 29 3b 0a 20 20 20 20  p", pSub));.    
31e50 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
31e60 50 6c 61 6e 53 65 74 49 64 28 70 50 61 72 73 65  PlanSetId(pParse
31e70 2c 70 53 75 62 29 3b 0a 20 20 20 20 20 20 20 20  ,pSub);.        
31e80 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
31e90 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
31ea0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
31eb0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
31ec0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62  RowLogEst = pSub
31ed0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
31ee0 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
31ef0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
31f00 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
31f10 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
31f20 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
31f30 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
31f40 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
31f50 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
31f60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
31f70 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
31f80 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
31f90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
31fa0 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
31fb0 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
31fc0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
31fd0 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
31fe0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
31ff0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
32000 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
32010 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72  ct_end;.    pPar
32020 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
32030 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
32040 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70  Height(p);.    p
32050 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
32060 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
32070 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a  Context;.#endif.
32080 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75    }..  /* Variou
32090 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  s elements of th
320a0 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20  e SELECT copied 
320b0 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61  into local varia
320c0 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f  bles for.  ** co
320d0 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70  nvenience */.  p
320e0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
320f0 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  t;.  pWhere = p-
32100 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
32110 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
32120 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
32130 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
32140 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
32150 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
32160 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
32170 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
32180 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
32190 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
321a0 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
321b0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
321c0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
321d0 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  ter all FROM-cla
321e0 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  use analysis:\n"
321f0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
32200 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
32210 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
32220 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
32230 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
32240 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
32250 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
32260 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
32270 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
32280 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
32290 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
322a0 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
322b0 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
322c0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
322d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
322e0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
322f0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
32300 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
32310 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
32320 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
32330 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
32340 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
32350 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
32360 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
32370 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
32380 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
32390 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
323a0 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
323b0 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
323c0 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
323d0 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
323e0 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
323f0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
32400 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
32410 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
32420 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
32430 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
32440 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
32450 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
32460 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
32470 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
32480 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
32490 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
324a0 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
324b0 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
324c0 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
324d0 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
324e0 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
324f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
32500 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
32510 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
32520 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
32530 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
32540 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
32550 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
32560 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
32570 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
32580 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
32590 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
325a0 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
325b0 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
325c0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
325d0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
325e0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
325f0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
32600 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
32610 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
32620 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
32630 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
32640 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
32650 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
32660 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
32670 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
32680 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
32690 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
326a0 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
326b0 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
326c0 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
326d0 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
326e0 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
326f0 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
32700 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
32710 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
32720 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
32730 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
32740 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
32750 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
32760 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
32770 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
32780 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
32790 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
327a0 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
327b0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
327c0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
327d0 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
327e0 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
327f0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
32800 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
32810 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
32820 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
32830 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
32840 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
32850 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
32860 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32870 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
32880 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
32890 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
328a0 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
328b0 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
328c0 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
328d0 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
328e0 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
328f0 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
32900 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
32910 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
32920 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
32930 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
32940 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
32950 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
32960 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
32970 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
32980 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
32990 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
329a0 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
329b0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
329c0 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
329d0 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
329e0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
329f0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
32a00 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
32a10 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
32a20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
32a30 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
32a40 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
32a50 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
32a60 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
32a70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
32a80 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
32a90 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
32aa0 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
32ab0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
32ac0 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
32ad0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
32ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32af0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
32b00 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
32b10 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
32b20 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
32b30 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
32b40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
32b50 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
32b60 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
32b70 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
32b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
32b90 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
32ba0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
32bb0 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
32bc0 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
32bd0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
32be0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
32bf0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
32c00 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
32c10 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
32c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32c30 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
32c40 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
32c50 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
32c60 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
32c70 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
32c80 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
32c90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
32ca0 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
32cb0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
32cc0 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
32cd0 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
32ce0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
32cf0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
32d00 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
32d10 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
32d20 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
32d30 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
32d40 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
32d50 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
32d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
32d70 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
32d80 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
32d90 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
32da0 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
32db0 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
32dc0 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
32dd0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
32de0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
32df0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
32e00 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
32e10 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
32e20 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
32e30 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
32e40 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
32e50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
32e60 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
32e70 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
32e80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
32e90 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
32ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32eb0 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
32ec0 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
32ed0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ef0 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
32f00 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
32f10 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
32f20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f40 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
32f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
32f60 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
32f70 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
32f80 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
32f90 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
32fa0 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
32fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
32fc0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
32fd0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
32fe0 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
32ff0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
33000 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
33010 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
33020 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
33030 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
33040 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
33050 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
33060 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
33070 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
33080 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
33090 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
330a0 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
330b0 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
330c0 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
330d0 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
330e0 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
330f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
33100 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43  an. */.    SELEC
33110 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
33120 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
33130 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  "));.    pWInfo 
33140 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
33150 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
33160 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
33170 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
33180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
331a0 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
331b0 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
331c0 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
331d0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
331e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
331f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
33200 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
33210 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
33220 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
33230 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
33240 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
33250 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
33260 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
33270 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
33280 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
33290 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
332a0 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
332b0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
332c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
332d0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
332e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
332f0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
33300 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
33310 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
33320 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
33330 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
33340 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
33350 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
33360 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
33370 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
33380 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
33390 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
333a0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
333b0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
333c0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
333d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
333e0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
333f0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
33400 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
33410 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
33420 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
33430 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
33440 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
33450 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
33460 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
33470 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
33480 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
33490 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
334a0 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
334b0 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
334c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
334d0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
334e0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
334f0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
33500 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
33510 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
33520 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  op. */.    asser
33530 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
33540 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65  List );.    sele
33550 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
33560 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
33570 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
33580 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
33590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
335a0 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
335b0 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
335c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
335e0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
335f0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
33600 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
33610 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
33620 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
33630 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
33640 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
33650 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
33660 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
33670 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
33680 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
33690 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
336a0 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
336b0 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
336c0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
336d0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
336e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
336f0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
33700 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
33710 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
33720 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
33730 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
33740 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
33750 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
33760 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
33770 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
33780 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
33790 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
337a0 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
337b0 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
337c0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
337d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
337f0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
33800 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
33810 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
33820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33830 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
33840 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
33850 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
33860 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
33870 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
33880 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
33890 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
338a0 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
338b0 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
338c0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
338d0 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
338e0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
338f0 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
33900 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
33910 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
33920 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
33930 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
33940 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
33950 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
33960 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
33970 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
33980 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
33990 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
339a0 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
339b0 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
339c0 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
339d0 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
339e0 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
339f0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
33a00 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
33a10 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
33a20 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
33a30 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
33a40 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
33a50 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
33a60 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
33a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a80 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
33a90 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
33aa0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
33ab0 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
33ac0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
33ad0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
33ae0 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
33af0 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
33b00 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
33b10 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
33b20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
33b30 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
33b40 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
33b50 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
33b60 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
33b70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
33b80 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
33b90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
33ba0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
33bb0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
33bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
33bd0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
33be0 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
33bf0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
33c00 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
33c10 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
33c20 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
33c30 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
33c40 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
33c50 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
33c60 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
33c70 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
33c80 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
33c90 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
33ca0 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
33cb0 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
33cc0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
33cd0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
33ce0 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
33cf0 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
33d00 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
33d10 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
33d20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
33d30 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
33d40 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
33d50 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
33d60 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
33d70 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
33d80 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
33d90 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
33da0 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
33db0 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
33dc0 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
33dd0 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
33de0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
33df0 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
33e00 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
33e10 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
33e20 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
33e30 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
33e40 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
33e50 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
33e60 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
33e70 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
33e80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
33e90 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
33ea0 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
33eb0 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
33ec0 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
33ed0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
33ee0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
33ef0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
33f00 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
33f10 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
33f20 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
33f30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
33f40 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
33f50 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
33f60 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
33f70 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
33f80 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
33f90 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
33fa0 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
33fb0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
33fc0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
33fd0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
33fe0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
33ff0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
34000 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
34010 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
34020 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
34030 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
34040 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
34050 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20  NC.uNC.pAggInfo 
34060 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
34070 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e   VVA_ONLY( sNC.n
34080 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67 67  cFlags = NC_UAgg
34090 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67 67  Info; ).    sAgg
340a0 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
340b0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
340c0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
340d0 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
340e0 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
340f0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
34100 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
34110 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
34120 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
34130 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
34140 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
34150 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
34160 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
34170 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
34180 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
34190 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  {.      if( pGro
341a0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
341b0 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d  assert( pWhere==
341c0 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20  p->pWhere );.   
341d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 61       assert( pHa
341e0 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67  ving==p->pHaving
341f0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
34200 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d  rt( pGroupBy==p-
34210 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20  >pGroupBy );.   
34220 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65       havingToWhe
34230 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  re(pParse, p);. 
34240 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
34250 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
34260 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
34270 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
34280 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
34290 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
342a0 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
342b0 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
342c0 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  .nColumn;.    if
342d0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
342e0 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d   && p->pHaving==
342f0 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46  0 && sAggInfo.nF
34300 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unc==1 ){.      
34310 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e  minMaxFlag = min
34320 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67  MaxQuery(db, sAg
34330 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70  gInfo.aFunc[0].p
34340 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72  Expr, &pMinMaxOr
34350 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  derBy);.    }els
34360 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  e{.      minMaxF
34370 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
34380 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
34390 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
343a0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
343b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
343c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
343d0 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
343e0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
343f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
34400 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
34410 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
34420 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
34430 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
34440 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
34450 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
34460 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
34470 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
34480 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
34490 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
344a0 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
344b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
344c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
344d0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
344e0 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  end;.#if SELECTT
344f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
34500 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
34510 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
34520 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
34530 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
34540 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
34550 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65 67  p,("After aggreg
34560 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  ate analysis:\n"
34570 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
34580 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
34590 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
345a0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
345b0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
345c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
345d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
345e0 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d  ("agg-column[%d]
345f0 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20   iMem=%d\n",.   
34600 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67           ii, sAg
34610 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69  gInfo.aCol[ii].i
34620 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
34630 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
34640 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  r(0, sAggInfo.aC
34650 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  ol[ii].pExpr, 0)
34660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34670 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
34680 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b  gInfo.nFunc; ii+
34690 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
346a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
346b0 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d  agg-func[%d]: iM
346c0 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  em=%d\n",.      
346d0 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e        ii, sAggIn
346e0 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65  fo.aFunc[ii].iMe
346f0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
34700 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
34710 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  0, sAggInfo.aFun
34720 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  c[ii].pExpr, 0);
34730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
34740 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50  endif...    /* P
34750 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
34760 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
34770 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
34780 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
34790 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
347a0 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
347b0 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
347c0 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
347d0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
347e0 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
347f0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
34800 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
34810 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
34820 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
34830 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b        int addr1;
34840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
34850 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
34860 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
34870 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
34880 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
34890 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
348a0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
348b0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
348c0 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
348d0 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
348e0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
348f0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
34900 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
34910 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
34920 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
34930 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
34940 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
34950 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
34960 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
34970 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
34980 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
34990 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
349a0 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
349b0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
349c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
349d0 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
349e0 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
349f0 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
34a00 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
34a10 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
34a20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
34a30 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
34a40 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
34a50 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
34a60 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
34a70 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
34a80 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
34a90 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
34aa0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
34ab0 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
34ac0 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
34ad0 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
34ae0 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
34af0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
34b00 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
34b10 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
34b20 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
34b30 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
34b40 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
34b50 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
34b60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
34b70 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
34b80 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
34b90 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
34ba0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
34bb0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
34bc0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41   pGroupBy, 0, sA
34bd0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
34be0 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
34bf0 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
34c00 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
34c10 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
34c20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
34c30 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
34c40 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
34c50 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
34c60 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
34c70 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
34c80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
34c90 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
34ca0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
34cb0 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
34cc0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
34cd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
34ce0 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
34cf0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
34d00 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
34d10 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
34d20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
34d30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
34d40 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
34d50 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
34d60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
34d70 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
34d80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
34d90 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
34da0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
34db0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
34dc0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
34dd0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
34de0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
34df0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
34e00 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
34e10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
34e20 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
34e30 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
34e40 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
34e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34e60 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
34e70 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
34e80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34e90 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
34ea0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
34eb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34ec0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
34ed0 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
34ee0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
34ef0 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
34f00 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
34f10 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
34f20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
34f30 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
34f40 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
34f50 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
34f60 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
34f70 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
34f80 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
34f90 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
34fa0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
34fb0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
34fc0 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
34fd0 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
34fe0 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
34ff0 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
35000 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
35010 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
35020 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
35030 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
35040 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
35050 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
35060 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
35070 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
35080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
35090 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
350a0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
350b0 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t);.      SELECT
350c0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
350d0 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
350e0 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
350f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
35100 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
35110 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
35120 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
35130 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
35140 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
35150 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
35160 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
35170 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
35180 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
35190 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
351a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
351b0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
351c0 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
351d0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
351e0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
351f0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
35200 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
35210 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
35220 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
35230 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
35240 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
35250 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
35260 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
35270 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
35280 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
35290 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
352a0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
352b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
352c0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
352d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
352e0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
352f0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
35300 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
35310 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
35320 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
35330 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
35340 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
35350 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
35360 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
35370 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
35380 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
35390 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
353a0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
353b0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
353c0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
353d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
353e0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
353f0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
35400 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
35410 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
35420 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
35430 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
35440 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
35450 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
35460 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
35470 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
35480 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
35490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354a0 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
354b0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
354c0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
354d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
354e0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
354f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
35500 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
35510 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
35520 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
35530 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
35540 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
35550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
35560 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
35570 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
35580 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
35590 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
355a0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
355b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
355c0 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
355d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
355e0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
355f0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
35600 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
35610 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
35620 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
35630 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
35640 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
35650 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
35660 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
35670 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
35680 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
35690 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
356a0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
356b0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
356c0 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
356d0 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
356e0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
356f0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
35700 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
35710 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
35720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
35730 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
35740 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72  ColumnToReg(pPar
35750 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
35760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35770 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
35780 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
35790 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
357a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
357b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
357c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
357d0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
357e0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
357f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
35800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35810 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
35820 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
35830 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
35840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
35850 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
35860 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
35870 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
35880 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
35890 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
358a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
358b0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
358c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
358d0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
358e0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
358f0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
35900 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
35910 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
35920 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
35930 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
35940 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
35950 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
35960 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
35970 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
35980 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35990 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
359a0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
359b0 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
359c0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
359d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
359e0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
359f0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
35a00 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
35a10 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
35a20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
35a30 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
35a40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
35a50 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
35a60 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
35a70 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
35a80 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
35a90 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
35aa0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
35ab0 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
35ac0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
35ad0 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
35ae0 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
35af0 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
35b00 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
35b10 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
35b20 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
35b30 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
35b40 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
35b50 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
35b60 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
35b70 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
35b80 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
35b90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
35ba0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
35bb0 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
35bc0 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
35bd0 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
35be0 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
35bf0 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
35c00 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
35c10 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a  IZER to .      *
35c20 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  * disable this o
35c30 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
35c40 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
35c50 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
35c60 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70  orderByGrp && Op
35c70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
35c80 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f  d(db, SQLITE_Gro
35c90 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20  upByOrder) .    
35ca0 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f     && (groupBySo
35cb0 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65  rt || sqlite3Whe
35cc0 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66  reIsSorted(pWInf
35cd0 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  o)).      ){.   
35ce0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
35cf0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
35d00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
35d10 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
35d20 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
35d30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
35d40 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
35d50 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
35d60 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
35d70 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
35d80 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
35d90 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
35da0 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
35db0 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
35dc0 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
35dd0 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
35de0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
35df0 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
35e00 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
35e10 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
35e20 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
35e30 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
35e40 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
35e50 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
35e60 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
35e70 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
35e80 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
35e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
35ea0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
35eb0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
35ec0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
35ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35ee0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
35ef0 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
35f00 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
35f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74           sortOut
35f30 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  , sortPTab);.   
35f40 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
35f50 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
35f60 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
35f70 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
35f80 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
35f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35fa0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
35fb0 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
35fc0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
35fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35fe0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
35ff0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
36000 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
36010 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
36020 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
36030 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
36040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36060 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
36070 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
36080 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
36090 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
360a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
360b0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
360c0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
360d0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
360e0 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
360f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
36100 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
36110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
36120 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
36130 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31  r1+1, 0, addr1+1
36140 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
36150 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
36160 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
36170 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
36180 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
36190 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
361a0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
361b0 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
361c0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
361d0 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
361e0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
361f0 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
36200 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
36210 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
36220 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
36230 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
36240 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
36250 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
36260 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
36270 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
36280 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
36290 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
362a0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
362b0 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
362c0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
362d0 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
362e0 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
362f0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
36300 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
36310 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36320 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
36330 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
36340 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
36350 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
36360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36370 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
36380 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
36390 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
363a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
363b0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
363c0 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
363d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
363e0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
363f0 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
36400 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
36410 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
36420 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
36430 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
36440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36450 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
36460 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
36470 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
36480 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36490 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
364a0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
364b0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
364c0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
364d0 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
364e0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
364f0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
36500 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
36510 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36520 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
36530 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
36540 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
36550 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
36560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36570 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
36580 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
36590 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
365a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
365b0 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
365c0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
365d0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
365e0 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
365f0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
36600 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
36610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36620 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
36630 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
36640 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
36650 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
36660 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
36670 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
36680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
36690 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
366a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
366b0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
366c0 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
366d0 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
366e0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
366f0 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
36700 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
36710 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36720 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
36730 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
36740 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
36750 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
36760 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
36770 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
36780 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
36790 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
367a0 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
367b0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
367c0 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20  (v, addrEnd);.. 
367d0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
367e0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
367f0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
36800 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
36810 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
36820 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
36830 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
36840 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
36850 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
36860 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
36870 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
36880 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
36890 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
368a0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
368b0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
368c0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
368d0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
368e0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
368f0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
36900 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
36910 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
36920 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
36930 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
36940 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
36950 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
36960 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36970 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
36980 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
36990 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
369a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
369b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
369c0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
369d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
369e0 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
369f0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
36a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36a10 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
36a20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
36a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36a40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
36a50 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
36a60 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
36a70 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
36a80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
36a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36aa0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
36ab0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
36ac0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
36ad0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
36ae0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
36af0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
36b00 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
36b10 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
36b20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
36b30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36b40 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
36b50 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
36b60 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
36b70 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
36b80 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
36b90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
36ba0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
36bb0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
36bc0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
36bd0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
36be0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
36bf0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
36c00 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
36c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
36c30 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
36c40 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
36c50 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
36c60 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
36c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
36c80 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
36c90 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
36ca0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
36cb0 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
36cc0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
36cd0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
36ce0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
36cf0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
36d00 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
36d10 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
36d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
36d30 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
36d40 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
36d50 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
36d60 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
36d70 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
36d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36d90 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
36da0 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
36db0 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
36dc0 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
36dd0 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
36de0 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
36df0 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
36e00 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66    else {.#ifndef
36e10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
36e20 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
36e30 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
36e40 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
36e50 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
36e60 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
36e70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
36e80 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
36e90 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
36ea0 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
36eb0 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
36ec0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
36ed0 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
36ee0 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
36ef0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
36f00 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
36f10 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
36f20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
36f30 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
36f40 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
36f50 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
36f60 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
36f70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
36f80 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
36f90 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
36fa0 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
36fb0 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
36fc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
36fd0 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
36fe0 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
36ff0 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
37000 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
37010 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
37020 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
37030 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
37040 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
37050 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
37060 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
37070 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
37080 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
37090 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
370a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
370b0 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
370c0 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
370d0 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
370e0 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
370f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37100 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
37110 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
37120 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
37130 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
37140 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
37150 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
37160 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
37170 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
37180 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
37190 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
371a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371b0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
371c0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
371d0 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
371e0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
371f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37200 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
37210 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
37220 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
37230 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
37240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
37250 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
37260 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
37270 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
37280 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
37290 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
372a0 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
372b0 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
372c0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
372d0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
372e0 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
372f0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
37300 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
37310 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
37320 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
37330 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
37340 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
37350 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
37360 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
37370 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
37380 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
37390 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
373a0 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
373b0 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
373c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
373d0 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
373e0 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
373f0 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
37400 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
37410 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
37420 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
37430 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
37440 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
37450 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
37460 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
37470 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
37480 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
37490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
374a0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
374b0 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
374c0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
374d0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
374e0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
374f0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
37500 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
37510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
37520 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
37530 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
37540 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
37550 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
37560 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
37570 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
37580 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
37590 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
375a0 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
375b0 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
375c0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
375d0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
375e0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
375f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
37600 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
37610 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
37620 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
37630 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
37640 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
37650 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
37660 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
37670 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
37680 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
37690 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
376a0 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
376b0 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
376c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
376d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
376e0 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
376f0 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
37700 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
37710 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
37720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
37730 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
37740 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
37750 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
37760 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
37770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37780 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
37790 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
377a0 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
377b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
377c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
377d0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
377e0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
377f0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
37800 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
37810 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
37820 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
37830 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
37840 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
37850 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
37860 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
37870 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
37880 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
37890 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
378a0 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
378b0 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
378c0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
378d0 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
378e0 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
378f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37900 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
37910 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
37920 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
37930 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
37940 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 20  AggInfo);..     
37950 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71 75     /* If this qu
37960 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
37970 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
37980 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
37990 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
379a0 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c 6c   minMaxFlag will
379b0 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
379c0 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69 74  ously set to eit
379d0 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  her.        ** W
379e0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
379f0 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
37a00 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d 61  Y_MAX and pMinMa
37a10 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20 20  xOrderBy will.  
37a20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20 61        ** be an a
37a30 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45 52  ppropriate ORDER
37a40 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 66   BY expression f
37a50 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  or the optimizat
37a60 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
37a70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37a80 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52  minMaxFlag==WHER
37a90 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
37aa0 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72   || pMinMaxOrder
37ab0 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By!=0 );.       
37ac0 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
37ad0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 4d  OrderBy==0 || pM
37ae0 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e 45  inMaxOrderBy->nE
37af0 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  xpr==1 );..     
37b00 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
37b10 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72  ,pParse,p,("Wher
37b20 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20  eBegin\n"));.   
37b30 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
37b40 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
37b50 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
37b60 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61  , pWhere, pMinMa
37b70 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  xOrderBy,.      
37b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b90 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
37ba0 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b 0a  minMaxFlag, 0);.
37bb0 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
37bc0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
37bd0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
37be0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
37bf0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
37c00 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
37c10 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
37c20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
37c30 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
37c40 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
37c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37c60 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57  Goto(v, sqlite3W
37c70 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
37c80 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
37c90 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
37ca0 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
37cb0 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
37cc0 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67 3d      (minMaxFlag=
37cd0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
37ce0 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
37cf0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37d00 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
37d10 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
37d20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
37d30 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
37d40 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
37d50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53       }..      sS
37d60 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
37d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
37d80 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
37d90 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
37da0 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
37db0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
37dc0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
37dd0 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c  Parse, p, -1, 0,
37de0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
37df0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
37e00 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
37e10 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
37e20 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
37e30 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
37e40 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
37e50 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
37e60 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
37e70 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
37e80 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
37e90 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
37ea0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
37eb0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
37ec0 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
37ed0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
37ee0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
37ef0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
37f00 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
37f10 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
37f20 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
37f30 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
37f40 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
37f50 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
37f60 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
37f70 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20  pTable(pParse,. 
37f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f90 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
37fa0 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
37fb0 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
37fc0 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 61  RDER BY");.    a
37fd0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
37fe0 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ==pEList );.    
37ff0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
38000 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
38010 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
38020 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
38030 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
38040 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
38050 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
38060 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
38070 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
38080 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
38090 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
380a0 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
380b0 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
380c0 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
380d0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
380e0 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
380f0 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
38100 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
38110 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
38120 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
38130 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
38140 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
38150 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
38160 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
38170 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
38180 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
38190 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
381a0 65 6c 65 74 65 28 64 62 2c 20 70 4d 69 6e 4d 61  elete(db, pMinMa
381b0 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c  xOrderBy);.  sql
381c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
381d0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
381e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
381f0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
38200 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  c);.#if SELECTTR
38210 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
38220 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c 70 50  LECTTRACE(0x1,pP
38230 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f  arse,p,("end pro
38240 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
38250 69 66 28 20 28 73 71 6c 69 74 65 33 53 65 6c 65  if( (sqlite3Sele
38260 63 74 54 72 61 63 65 20 26 20 30 78 32 30 30 30  ctTrace & 0x2000
38270 29 21 3d 30 20 26 26 20 45 78 70 6c 61 69 6e 51  )!=0 && ExplainQ
38280 75 65 72 79 50 6c 61 6e 50 61 72 65 6e 74 28 70  ueryPlanParent(p
38290 50 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Parse)==0 ){.   
382a0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
382b0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
382c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 45 78  .  }.#endif.  Ex
382d0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
382e0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  p(pParse);.  ret
382f0 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.