System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 49e0cd4299950d384fe163903ef7a07b8f615237:


0000: 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  //--------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 0d 0a 2f 2f 20 3c 63 6f 70  -------..// <cop
0050: 79 72 69 67 68 74 20 66 69 6c 65 3d 22 53 71 6c  yright file="Sql
0060: 47 65 6e 65 72 61 74 6f 72 2e 63 73 22 20 63 6f  Generator.cs" co
0070: 6d 70 61 6e 79 3d 22 4d 69 63 72 6f 73 6f 66 74  mpany="Microsoft
0080: 22 3e 0d 0a 2f 2f 20 20 20 20 20 20 50 6f 72 74  ">..//      Port
0090: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 69 6c  ions of this fil
00a0: 65 20 63 6f 70 79 72 69 67 68 74 20 28 63 29 20  e copyright (c) 
00b0: 4d 69 63 72 6f 73 6f 66 74 20 43 6f 72 70 6f 72  Microsoft Corpor
00c0: 61 74 69 6f 6e 0d 0a 2f 2f 20 20 20 20 20 20 61  ation..//      a
00d0: 6e 64 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  nd are released 
00e0: 75 6e 64 65 72 20 74 68 65 20 4d 69 63 72 6f 73  under the Micros
00f0: 6f 66 74 20 50 75 6c 69 63 20 4c 69 63 65 6e 73  oft Pulic Licens
0100: 65 2e 20 20 53 65 65 0d 0a 2f 2f 20 20 20 20 20  e.  See..//     
0110: 20 68 74 74 70 3a 2f 2f 61 72 63 68 69 76 65 2e   http://archive.
0120: 6d 73 64 6e 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  msdn.microsoft.c
0130: 6f 6d 2f 45 46 53 61 6d 70 6c 65 50 72 6f 76 69  om/EFSampleProvi
0140: 64 65 72 2f 50 72 6f 6a 65 63 74 2f 4c 69 63 65  der/Project/Lice
0150: 6e 73 65 2e 61 73 70 78 0d 0a 2f 2f 20 20 20 20  nse.aspx..//    
0160: 20 20 6f 72 20 4c 69 63 65 6e 73 65 2e 74 78 74    or License.txt
0170: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0d 0a 2f   for details.../
0180: 2f 20 20 20 20 20 20 41 6c 6c 20 72 69 67 68 74  /      All right
0190: 73 20 72 65 73 65 72 76 65 64 2e 0d 0a 2f 2f 20  s reserved...// 
01a0: 3c 2f 63 6f 70 79 72 69 67 68 74 3e 0d 0a 2f 2f  </copyright>..//
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01f0: 2d 2d 2d 2d 2d 0d 0a 0d 0a 23 69 66 20 55 53 45  -----....#if USE
0200: 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f 52  _ENTITY_FRAMEWOR
0210: 4b 5f 36 0d 0a 6e 61 6d 65 73 70 61 63 65 20 53  K_6..namespace S
0220: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
0230: 65 2e 45 46 36 0d 0a 23 65 6c 73 65 0d 0a 6e 61  e.EF6..#else..na
0240: 6d 65 73 70 61 63 65 20 53 79 73 74 65 6d 2e 44  mespace System.D
0250: 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d  ata.SQLite.Linq.
0260: 0a 23 65 6e 64 69 66 0d 0a 7b 0d 0a 20 20 75 73  .#endif..{..  us
0270: 69 6e 67 20 53 79 73 74 65 6d 3b 0d 0a 20 20 75  ing System;..  u
0280: 73 69 6e 67 20 53 79 73 74 65 6d 2e 4c 69 6e 71  sing System.Linq
0290: 3b 0d 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65  ;..  using Syste
02a0: 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 3b 0d 0a  m.Diagnostics;..
02b0: 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 47    using System.G
02c0: 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 3b 0d 0a 20  lobalization;.. 
02d0: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 54 65   using System.Te
02e0: 78 74 3b 0d 0a 20 20 75 73 69 6e 67 20 53 79 73  xt;..  using Sys
02f0: 74 65 6d 2e 44 61 74 61 2e 43 6f 6d 6d 6f 6e 3b  tem.Data.Common;
0300: 0d 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d  ..  using System
0310: 2e 44 61 74 61 3b 0d 0a 20 20 75 73 69 6e 67 20  .Data;..  using 
0320: 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69 6f  System.Collectio
0330: 6e 73 2e 4f 62 6a 65 63 74 4d 6f 64 65 6c 3b 0d  ns.ObjectModel;.
0340: 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e  .  using System.
0350: 43 6f 6c 6c 65 63 74 69 6f 6e 73 2e 47 65 6e 65  Collections.Gene
0360: 72 69 63 3b 0d 0a 0d 0a 23 69 66 20 55 53 45 5f  ric;....#if USE_
0370: 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f 52 4b  ENTITY_FRAMEWORK
0380: 5f 36 0d 0a 20 20 75 73 69 6e 67 20 53 79 73 74  _6..  using Syst
0390: 65 6d 2e 44 61 74 61 2e 45 6e 74 69 74 79 2e 43  em.Data.Entity.C
03a0: 6f 72 65 2e 4d 65 74 61 64 61 74 61 2e 45 64 6d  ore.Metadata.Edm
03b0: 3b 0d 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65  ;..  using Syste
03c0: 6d 2e 44 61 74 61 2e 45 6e 74 69 74 79 2e 43 6f  m.Data.Entity.Co
03d0: 72 65 2e 43 6f 6d 6d 6f 6e 2e 43 6f 6d 6d 61 6e  re.Common.Comman
03e0: 64 54 72 65 65 73 3b 0d 0a 23 65 6c 73 65 0d 0a  dTrees;..#else..
03f0: 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44    using System.D
0400: 61 74 61 2e 4d 65 74 61 64 61 74 61 2e 45 64 6d  ata.Metadata.Edm
0410: 3b 0d 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65  ;..  using Syste
0420: 6d 2e 44 61 74 61 2e 43 6f 6d 6d 6f 6e 2e 43 6f  m.Data.Common.Co
0430: 6d 6d 61 6e 64 54 72 65 65 73 3b 0d 0a 23 65 6e  mmandTrees;..#en
0440: 64 69 66 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75  dif....  /// <su
0450: 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 54 72  mmary>..  /// Tr
0460: 61 6e 73 6c 61 74 65 73 20 74 68 65 20 63 6f 6d  anslates the com
0470: 6d 61 6e 64 20 6f 62 6a 65 63 74 20 69 6e 74 6f  mand object into
0480: 20 61 20 53 51 4c 20 73 74 72 69 6e 67 20 74 68   a SQL string th
0490: 61 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  at can be execut
04a0: 65 64 20 6f 6e 0d 0a 20 20 2f 2f 2f 20 53 51 4c  ed on..  /// SQL
04b0: 69 74 65 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75  ite...  /// </su
04c0: 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c 72  mmary>..  /// <r
04d0: 65 6d 61 72 6b 73 3e 0d 0a 20 20 2f 2f 2f 20 54  emarks>..  /// T
04e0: 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69  he translation i
04f0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
0500: 20 61 20 76 69 73 69 74 6f 72 20 3c 73 65 65 20   a visitor <see 
0510: 63 72 65 66 3d 22 44 62 45 78 70 72 65 73 73 69  cref="DbExpressi
0520: 6f 6e 56 69 73 69 74 6f 72 7b 54 7d 22 2f 3e 0d  onVisitor{T}"/>.
0530: 0a 20 20 2f 2f 2f 20 6f 76 65 72 20 74 68 65 20  .  /// over the 
0540: 71 75 65 72 79 20 74 72 65 65 2e 20 20 49 74 20  query tree.  It 
0550: 6d 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 70  makes a single p
0560: 61 73 73 20 6f 76 65 72 20 74 68 65 20 74 72 65  ass over the tre
0570: 65 2c 20 63 6f 6c 6c 65 63 74 69 6e 67 20 74 68  e, collecting th
0580: 65 20 73 71 6c 0d 0a 20 20 2f 2f 2f 20 66 72 61  e sql..  /// fra
0590: 67 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 76  gments for the v
05a0: 61 72 69 6f 75 73 20 6e 6f 64 65 73 20 69 6e 20  arious nodes in 
05b0: 74 68 65 20 74 72 65 65 20 3c 73 65 65 20 63 72  the tree <see cr
05c0: 65 66 3d 22 49 53 71 6c 46 72 61 67 6d 65 6e 74  ef="ISqlFragment
05d0: 22 2f 3e 2e 0d 0a 20 20 2f 2f 2f 0d 0a 20 20 2f  "/>...  ///..  /
05e0: 2f 2f 20 54 68 65 20 6d 61 6a 6f 72 20 6f 70 65  // The major ope
05f0: 72 61 74 69 6f 6e 73 20 61 72 65 0d 0a 20 20 2f  rations are..  /
0600: 2f 2f 20 3c 6c 69 73 74 20 74 79 70 65 3d 22 62  // <list type="b
0610: 75 6c 6c 65 74 22 3e 0d 0a 20 20 2f 2f 2f 20 3c  ullet">..  /// <
0620: 69 74 65 6d 3e 53 65 6c 65 63 74 20 73 74 61 74  item>Select stat
0630: 65 6d 65 6e 74 20 6d 69 6e 69 6d 69 7a 61 74 69  ement minimizati
0640: 6f 6e 2e 20 20 4d 75 6c 74 69 70 6c 65 20 6e 6f  on.  Multiple no
0650: 64 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  des in the query
0660: 20 74 72 65 65 0d 0a 20 20 2f 2f 2f 20 74 68 61   tree..  /// tha
0670: 74 20 63 61 6e 20 62 65 20 70 61 72 74 20 6f 66  t can be part of
0680: 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 65   a single SQL se
0690: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 61  lect statement a
06a0: 72 65 20 6d 65 72 67 65 64 2e 20 65 2e 67 2e 20  re merged. e.g. 
06b0: 61 0d 0a 20 20 2f 2f 2f 20 46 69 6c 74 65 72 20  a..  /// Filter 
06c0: 6e 6f 64 65 20 74 68 61 74 20 69 73 20 74 68 65  node that is the
06d0: 20 69 6e 70 75 74 20 6f 66 20 61 20 50 72 6f 6a   input of a Proj
06e0: 65 63 74 20 6e 6f 64 65 20 63 61 6e 20 74 79 70  ect node can typ
06f0: 69 63 61 6c 6c 79 20 73 68 61 72 65 20 74 68 65  ically share the
0700: 0d 0a 20 20 2f 2f 2f 20 73 61 6d 65 20 53 51 4c  ..  /// same SQL
0710: 20 73 74 61 74 65 6d 65 6e 74 2e 3c 2f 69 74 65   statement.</ite
0720: 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e  m>..  /// <item>
0730: 41 6c 70 68 61 2d 72 65 6e 61 6d 69 6e 67 2e 20  Alpha-renaming. 
0740: 20 41 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   As a result of 
0750: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 69  the statement mi
0760: 6e 69 6d 69 7a 61 74 69 6f 6e 20 61 62 6f 76 65  nimization above
0770: 2c 20 74 68 65 72 65 0d 0a 20 20 2f 2f 2f 20 63  , there..  /// c
0780: 6f 75 6c 64 20 62 65 20 6e 61 6d 65 20 63 6f 6c  ould be name col
0790: 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69  lisions when usi
07a0: 6e 67 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75  ng correlated su
07b0: 62 71 75 65 72 69 65 73 0d 0a 20 20 2f 2f 2f 20  bqueries..  /// 
07c0: 3c 65 78 61 6d 70 6c 65 3e 0d 0a 20 20 2f 2f 2f  <example>..  ///
07d0: 20 3c 63 6f 64 65 3e 0d 0a 20 20 2f 2f 2f 20 46   <code>..  /// F
07e0: 69 6c 74 65 72 28 0d 0a 20 20 2f 2f 2f 20 20 20  ilter(..  ///   
07f0: 20 20 62 20 3d 20 50 72 6f 6a 65 63 74 28 20 63    b = Project( c
0800: 2e 78 0d 0a 20 20 2f 2f 2f 20 20 20 20 20 20 20  .x..  ///       
0810: 20 20 63 20 3d 20 45 78 74 65 6e 74 28 66 6f 6f    c = Extent(foo
0820: 29 0d 0a 20 20 2f 2f 2f 20 20 20 20 20 20 20 20  )..  ///        
0830: 20 29 0d 0a 20 20 2f 2f 2f 20 20 20 20 20 65 78   )..  ///     ex
0840: 69 73 74 73 20 28 0d 0a 20 20 2f 2f 2f 20 20 20  ists (..  ///   
0850: 20 20 20 20 20 20 46 69 6c 74 65 72 28 0d 0a 20        Filter(.. 
0860: 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20   ///            
0870: 20 63 20 3d 20 45 78 74 65 6e 74 28 66 6f 6f 29   c = Extent(foo)
0880: 0d 0a 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20  ..  ///         
0890: 20 20 20 20 62 2e 78 20 3d 20 63 2e 78 0d 0a 20      b.x = c.x.. 
08a0: 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20   ///            
08b0: 20 29 0d 0a 20 20 2f 2f 2f 20 20 20 20 20 29 0d   )..  ///     ).
08c0: 0a 20 20 2f 2f 2f 20 29 0d 0a 20 20 2f 2f 2f 20  .  /// )..  /// 
08d0: 3c 2f 63 6f 64 65 3e 0d 0a 20 20 2f 2f 2f 20 54  </code>..  /// T
08e0: 68 65 20 66 69 72 73 74 20 46 69 6c 74 65 72 2c  he first Filter,
08f0: 20 50 72 6f 6a 65 63 74 20 61 6e 64 20 45 78 74   Project and Ext
0900: 65 6e 74 20 77 69 6c 6c 20 73 68 61 72 65 20 74  ent will share t
0910: 68 65 20 73 61 6d 65 20 53 51 4c 20 73 65 6c 65  he same SQL sele
0920: 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20  ct statement... 
0930: 20 2f 2f 2f 20 54 68 65 20 61 6c 69 61 73 20 66   /// The alias f
0940: 6f 72 20 74 68 65 20 50 72 6f 6a 65 63 74 20 69  or the Project i
0950: 2e 65 2e 20 62 2c 20 77 69 6c 6c 20 62 65 20 72  .e. b, will be r
0960: 65 70 6c 61 63 65 64 20 77 69 74 68 20 63 2e 0d  eplaced with c..
0970: 0a 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 61 6c  .  /// If the al
0980: 69 61 73 20 63 20 66 6f 72 20 74 68 65 20 46 69  ias c for the Fi
0990: 6c 74 65 72 20 77 69 74 68 69 6e 20 74 68 65 20  lter within the 
09a0: 65 78 69 73 74 73 20 63 6c 61 75 73 65 20 69 73  exists clause is
09b0: 20 6e 6f 74 20 72 65 6e 61 6d 65 64 2c 0d 0a 20   not renamed,.. 
09c0: 20 2f 2f 2f 20 77 65 20 77 69 6c 6c 20 67 65 74   /// we will get
09d0: 20 3c 63 3e 63 2e 78 20 3d 20 63 2e 78 3c 2f 63   <c>c.x = c.x</c
09e0: 3e 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  >, which is inco
09f0: 72 72 65 63 74 2e 0d 0a 20 20 2f 2f 2f 20 49 6e  rrect...  /// In
0a00: 73 74 65 61 64 2c 20 74 68 65 20 61 6c 69 61 73  stead, the alias
0a10: 20 63 20 77 69 74 68 69 6e 20 74 68 65 20 73 65   c within the se
0a20: 63 6f 6e 64 20 66 69 6c 74 65 72 20 73 68 6f 75  cond filter shou
0a30: 6c 64 20 62 65 20 72 65 6e 61 6d 65 64 20 74 6f  ld be renamed to
0a40: 20 63 31 2c 20 74 6f 20 67 69 76 65 0d 0a 20 20   c1, to give..  
0a50: 2f 2f 2f 20 3c 63 3e 63 2e 78 20 3d 20 63 31 2e  /// <c>c.x = c1.
0a60: 78 3c 2f 63 3e 20 69 2e 65 2e 20 62 20 69 73 20  x</c> i.e. b is 
0a70: 72 65 6e 61 6d 65 64 20 74 6f 20 63 2c 20 61 6e  renamed to c, an
0a80: 64 20 63 20 69 73 20 72 65 6e 61 6d 65 64 20 74  d c is renamed t
0a90: 6f 20 63 31 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 65  o c1...  /// </e
0aa0: 78 61 6d 70 6c 65 3e 0d 0a 20 20 2f 2f 2f 20 3c  xample>..  /// <
0ab0: 2f 69 74 65 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 69  /item>..  /// <i
0ac0: 74 65 6d 3e 4a 6f 69 6e 20 66 6c 61 74 74 65 6e  tem>Join flatten
0ad0: 69 6e 67 2e 20 20 49 6e 20 74 68 65 20 71 75 65  ing.  In the que
0ae0: 72 79 20 74 72 65 65 2c 20 61 20 6c 69 73 74 20  ry tree, a list 
0af0: 6f 66 20 6a 6f 69 6e 20 6e 6f 64 65 73 20 69 73  of join nodes is
0b00: 20 74 79 70 69 63 61 6c 6c 79 0d 0a 20 20 2f 2f   typically..  //
0b10: 2f 20 72 65 70 72 65 73 65 6e 74 65 64 20 61 73  / represented as
0b20: 20 61 20 74 72 65 65 20 6f 66 20 4a 6f 69 6e 20   a tree of Join 
0b30: 6e 6f 64 65 73 2c 20 65 61 63 68 20 77 69 74 68  nodes, each with
0b40: 20 32 20 63 68 69 6c 64 72 65 6e 2e 20 65 2e 67   2 children. e.g
0b50: 2e 0d 0a 20 20 2f 2f 2f 20 3c 65 78 61 6d 70 6c  ...  /// <exampl
0b60: 65 3e 0d 0a 20 20 2f 2f 2f 20 3c 63 6f 64 65 3e  e>..  /// <code>
0b70: 0d 0a 20 20 2f 2f 2f 20 61 20 3d 20 4a 6f 69 6e  ..  /// a = Join
0b80: 28 49 6e 6e 65 72 4a 6f 69 6e 0d 0a 20 20 2f 2f  (InnerJoin..  //
0b90: 2f 20 20 20 20 20 62 20 3d 20 4a 6f 69 6e 28 43  /     b = Join(C
0ba0: 72 6f 73 73 4a 6f 69 6e 0d 0a 20 20 2f 2f 2f 20  rossJoin..  /// 
0bb0: 20 20 20 20 20 20 20 20 63 20 3d 20 45 78 74 65          c = Exte
0bc0: 6e 74 28 66 6f 6f 29 0d 0a 20 20 2f 2f 2f 20 20  nt(foo)..  ///  
0bd0: 20 20 20 20 20 20 20 64 20 3d 20 45 78 74 65 6e         d = Exten
0be0: 74 28 66 6f 6f 29 0d 0a 20 20 2f 2f 2f 20 20 20  t(foo)..  ///   
0bf0: 20 20 20 20 20 20 29 0d 0a 20 20 2f 2f 2f 20 20        )..  ///  
0c00: 20 20 20 65 20 3d 20 45 78 74 65 6e 74 28 66 6f     e = Extent(fo
0c10: 6f 29 0d 0a 20 20 2f 2f 2f 20 20 20 20 20 6f 6e  o)..  ///     on
0c20: 20 62 2e 63 2e 78 20 3d 20 65 2e 78 0d 0a 20 20   b.c.x = e.x..  
0c30: 2f 2f 2f 20 20 20 20 20 29 0d 0a 20 20 2f 2f 2f  ///     )..  ///
0c40: 20 3c 2f 63 6f 64 65 3e 0d 0a 20 20 2f 2f 2f 20   </code>..  /// 
0c50: 49 66 20 74 72 61 6e 73 6c 61 74 65 64 20 64 69  If translated di
0c60: 72 65 63 74 6c 79 2c 20 74 68 69 73 20 77 69 6c  rectly, this wil
0c70: 6c 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20  l be translated 
0c80: 74 6f 0d 0a 20 20 2f 2f 2f 20 3c 63 6f 64 65 3e  to..  /// <code>
0c90: 0d 0a 20 20 2f 2f 2f 20 46 52 4f 4d 20 28 20 53  ..  /// FROM ( S
0ca0: 45 4c 45 43 54 20 63 2e 2a 2c 20 64 2e 2a 0d 0a  ELECT c.*, d.*..
0cb0: 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 46 52    ///         FR
0cc0: 4f 4d 20 66 6f 6f 20 61 73 20 63 0d 0a 20 20 2f  OM foo as c..  /
0cd0: 2f 2f 20 20 20 20 20 20 20 20 20 43 52 4f 53 53  //         CROSS
0ce0: 20 4a 4f 49 4e 20 66 6f 6f 20 61 73 20 64 29 20   JOIN foo as d) 
0cf0: 61 73 20 62 0d 0a 20 20 2f 2f 2f 20 49 4e 4e 45  as b..  /// INNE
0d00: 52 20 4a 4f 49 4e 20 66 6f 6f 20 61 73 20 65 20  R JOIN foo as e 
0d10: 6f 6e 20 62 2e 78 27 20 3d 20 65 2e 78 0d 0a 20  on b.x' = e.x.. 
0d20: 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 0d 0a 20 20   /// </code>..  
0d30: 2f 2f 2f 20 49 74 20 77 6f 75 6c 64 20 62 65 20  /// It would be 
0d40: 62 65 74 74 65 72 20 74 6f 20 74 72 61 6e 73 6c  better to transl
0d50: 61 74 65 20 74 68 69 73 20 61 73 0d 0a 20 20 2f  ate this as..  /
0d60: 2f 2f 20 3c 63 6f 64 65 3e 0d 0a 20 20 2f 2f 2f  // <code>..  ///
0d70: 20 46 52 4f 4d 20 66 6f 6f 20 61 73 20 63 0d 0a   FROM foo as c..
0d80: 20 20 2f 2f 2f 20 43 52 4f 53 53 20 4a 4f 49 4e    /// CROSS JOIN
0d90: 20 66 6f 6f 20 61 73 20 64 0d 0a 20 20 2f 2f 2f   foo as d..  ///
0da0: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 66 6f 6f 20   INNER JOIN foo 
0db0: 61 73 20 65 20 6f 6e 20 63 2e 78 20 3d 20 65 2e  as e on c.x = e.
0dc0: 78 0d 0a 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e  x..  /// </code>
0dd0: 0d 0a 20 20 2f 2f 2f 20 54 68 69 73 20 61 6c 6c  ..  /// This all
0de0: 6f 77 73 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  ows the optimize
0df0: 72 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 61  r to choose an a
0e00: 70 70 72 6f 70 72 69 61 74 65 20 6a 6f 69 6e 20  ppropriate join 
0e10: 6f 72 64 65 72 69 6e 67 20 66 6f 72 20 65 76 61  ordering for eva
0e20: 6c 75 61 74 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20  luation...  /// 
0e30: 3c 2f 65 78 61 6d 70 6c 65 3e 0d 0a 20 20 2f 2f  </example>..  //
0e40: 2f 20 3c 2f 69 74 65 6d 3e 0d 0a 20 20 2f 2f 2f  / </item>..  ///
0e50: 20 3c 69 74 65 6d 3e 53 65 6c 65 63 74 20 2a 20   <item>Select * 
0e60: 61 6e 64 20 63 6f 6c 75 6d 6e 20 72 65 6e 61 6d  and column renam
0e70: 69 6e 67 2e 20 20 49 6e 20 74 68 65 20 65 78 61  ing.  In the exa
0e80: 6d 70 6c 65 20 61 62 6f 76 65 2c 20 77 65 20 6e  mple above, we n
0e90: 6f 74 69 63 65 64 20 74 68 61 74 0d 0a 20 20 2f  oticed that..  /
0ea0: 2f 2f 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  // in some cases
0eb0: 20 77 65 20 61 64 64 20 3c 63 3e 53 45 4c 45 43   we add <c>SELEC
0ec0: 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 3c 2f 63 3e  T * FROM ...</c>
0ed0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
0ee0: 20 53 51 4c 0d 0a 20 20 2f 2f 2f 20 73 74 61 74   SQL..  /// stat
0ef0: 65 6d 65 6e 74 2e 20 69 2e 65 2e 20 74 68 65 72  ement. i.e. ther
0f00: 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74  e is no explicit
0f10: 20 50 52 4f 4a 45 43 54 20 6c 69 73 74 2e 0d 0a   PROJECT list...
0f20: 20 20 2f 2f 2f 20 49 6e 20 74 68 69 73 20 63 61    /// In this ca
0f30: 73 65 2c 20 77 65 20 65 6e 75 6d 65 72 61 74 65  se, we enumerate
0f40: 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73   all the columns
0f50: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
0f60: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0d 0a 20  e FROM clause.. 
0f70: 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 70 61 72   /// This is par
0f80: 74 69 63 75 6c 61 72 6c 79 20 70 72 6f 62 6c 65  ticularly proble
0f90: 6d 61 74 69 63 20 69 6e 20 74 68 65 20 63 61 73  matic in the cas
0fa0: 65 20 6f 66 20 4a 6f 69 6e 20 74 72 65 65 73 2c  e of Join trees,
0fb0: 20 73 69 6e 63 65 20 74 68 65 20 63 6f 6c 75 6d   since the colum
0fc0: 6e 73 0d 0a 20 20 2f 2f 2f 20 66 72 6f 6d 20 74  ns..  /// from t
0fd0: 68 65 20 65 78 74 65 6e 74 73 20 6a 6f 69 6e 65  he extents joine
0fe0: 64 20 6d 69 67 68 74 20 68 61 76 65 20 74 68 65  d might have the
0ff0: 20 73 61 6d 65 20 6e 61 6d 65 20 2d 20 74 68 69   same name - thi
1000: 73 20 69 73 20 69 6c 6c 65 67 61 6c 2e 20 20 54  s is illegal.  T
1010: 6f 20 73 6f 6c 76 65 0d 0a 20 20 2f 2f 2f 20 74  o solve..  /// t
1020: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  his problem, we 
1030: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 72 65 6e  will have to ren
1040: 61 6d 65 20 63 6f 6c 75 6d 6e 73 20 69 66 20 74  ame columns if t
1050: 68 65 79 20 61 72 65 20 70 61 72 74 20 6f 66 20  hey are part of 
1060: 61 20 53 45 4c 45 43 54 20 2a 0d 0a 20 20 2f 2f  a SELECT *..  //
1070: 2f 20 66 6f 72 20 61 20 4a 4f 49 4e 20 6e 6f 64  / for a JOIN nod
1080: 65 20 2d 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  e - we do not ne
1090: 65 64 20 72 65 6e 61 6d 69 6e 67 20 69 6e 20 61  ed renaming in a
10a0: 6e 79 20 6f 74 68 65 72 20 73 69 74 75 61 74 69  ny other situati
10b0: 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20 3c 73 65 65 20  on...  /// <see 
10c0: 63 72 65 66 3d 22 53 71 6c 47 65 6e 65 72 61 74  cref="SqlGenerat
10d0: 6f 72 2e 41 64 64 44 65 66 61 75 6c 74 43 6f 6c  or.AddDefaultCol
10e0: 75 6d 6e 73 22 2f 3e 2e 0d 0a 20 20 2f 2f 2f 20  umns"/>...  /// 
10f0: 3c 2f 69 74 65 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c  </item>..  /// <
1100: 2f 6c 69 73 74 3e 0d 0a 20 20 2f 2f 2f 0d 0a 20  /list>..  ///.. 
1110: 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 2f   /// <para>..  /
1120: 2f 2f 20 52 65 6e 61 6d 69 6e 67 20 69 73 73 75  // Renaming issu
1130: 65 73 2e 0d 0a 20 20 2f 2f 2f 20 57 68 65 6e 20  es...  /// When 
1140: 72 6f 77 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20  rows or columns 
1150: 61 72 65 20 72 65 6e 61 6d 65 64 2c 20 77 65 20  are renamed, we 
1160: 70 72 6f 64 75 63 65 20 6e 61 6d 65 73 20 74 68  produce names th
1170: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 67 6c  at are unique gl
1180: 6f 62 61 6c 6c 79 0d 0a 20 20 2f 2f 2f 20 77 69  obally..  /// wi
1190: 74 68 20 72 65 73 70 65 63 74 20 74 6f 20 74 68  th respect to th
11a0: 65 20 71 75 65 72 79 2e 20 20 54 68 65 20 6e 61  e query.  The na
11b0: 6d 65 73 20 61 72 65 20 64 65 72 69 76 65 64 20  mes are derived 
11c0: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
11d0: 6c 20 6e 61 6d 65 73 2c 0d 0a 20 20 2f 2f 2f 20  l names,..  /// 
11e0: 77 69 74 68 20 61 6e 20 69 6e 74 65 67 65 72 20  with an integer 
11f0: 61 73 20 61 20 73 75 66 66 69 78 2e 20 65 2e 67  as a suffix. e.g
1200: 2e 20 43 75 73 74 6f 6d 65 72 49 64 20 77 69 6c  . CustomerId wil
1210: 6c 20 62 65 20 72 65 6e 61 6d 65 64 20 74 6f 20  l be renamed to 
1220: 43 75 73 74 6f 6d 65 72 49 64 31 2c 0d 0a 20 20  CustomerId1,..  
1230: 2f 2f 2f 20 43 75 73 74 6f 6d 65 72 49 64 32 20  /// CustomerId2 
1240: 65 74 63 2e 0d 0a 20 20 2f 2f 2f 0d 0a 20 20 2f  etc...  ///..  /
1250: 2f 2f 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  // Since the nam
1260: 65 73 20 67 65 6e 65 72 61 74 65 64 20 61 72 65  es generated are
1270: 20 67 6c 6f 62 61 6c 6c 79 20 75 6e 69 71 75 65   globally unique
1280: 2c 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20  , they will not 
1290: 63 6f 6e 66 6c 69 63 74 20 77 68 65 6e 20 74 68  conflict when th
12a0: 65 0d 0a 20 20 2f 2f 2f 20 63 6f 6c 75 6d 6e 73  e..  /// columns
12b0: 20 6f 66 20 61 20 4a 4f 49 4e 20 53 45 4c 45 43   of a JOIN SELEC
12c0: 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  T statement are 
12d0: 6a 6f 69 6e 65 64 20 77 69 74 68 20 61 6e 6f 74  joined with anot
12e0: 68 65 72 20 4a 4f 49 4e 2e 0d 0a 20 20 2f 2f 2f  her JOIN...  ///
12f0: 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d  ..  /// </para>.
1300: 0a 20 20 2f 2f 2f 0d 0a 20 20 2f 2f 2f 20 3c 70  .  ///..  /// <p
1310: 61 72 61 3e 0d 0a 20 20 2f 2f 2f 20 52 65 63 6f  ara>..  /// Reco
1320: 72 64 20 66 6c 61 74 74 65 6e 69 6e 67 2e 0d 0a  rd flattening...
1330: 20 20 2f 2f 2f 20 53 51 4c 20 73 65 72 76 65 72    /// SQL server
1340: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1350: 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 72 65  he concept of re
1360: 63 6f 72 64 73 2e 20 20 48 6f 77 65 76 65 72 2c  cords.  However,
1370: 20 61 20 6a 6f 69 6e 20 73 74 61 74 65 6d 65 6e   a join statemen
1380: 74 0d 0a 20 20 2f 2f 2f 20 70 72 6f 64 75 63 65  t..  /// produce
1390: 73 20 72 65 63 6f 72 64 73 2e 20 20 57 65 20 68  s records.  We h
13a0: 61 76 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 74  ave to flatten t
13b0: 68 65 20 72 65 63 6f 72 64 20 61 63 63 65 73 73  he record access
13c0: 65 73 20 69 6e 74 6f 20 61 20 73 69 6d 70 6c 65  es into a simple
13d0: 0d 0a 20 20 2f 2f 2f 20 3c 63 3e 61 6c 69 61 73  ..  /// <c>alias
13e0: 2e 63 6f 6c 75 6d 6e 3c 2f 63 3e 20 66 6f 72 6d  .column</c> form
13f0: 2e 20 20 3c 73 65 65 20 63 72 65 66 3d 22 53 71  .  <see cref="Sq
1400: 6c 47 65 6e 65 72 61 74 6f 72 2e 56 69 73 69 74  lGenerator.Visit
1410: 28 44 62 50 72 6f 70 65 72 74 79 45 78 70 72 65  (DbPropertyExpre
1420: 73 73 69 6f 6e 29 22 2f 3e 0d 0a 20 20 2f 2f 2f  ssion)"/>..  ///
1430: 20 3c 2f 70 61 72 61 3e 0d 0a 20 20 2f 2f 2f 0d   </para>..  ///.
1440: 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20  .  /// <para>.. 
1450: 20 2f 2f 2f 20 42 75 69 6c 64 69 6e 67 20 74 68   /// Building th
1460: 65 20 53 51 4c 2e 0d 0a 20 20 2f 2f 2f 20 54 68  e SQL...  /// Th
1470: 65 72 65 20 61 72 65 20 32 20 70 68 61 73 65 73  ere are 2 phases
1480: 0d 0a 20 20 2f 2f 2f 20 3c 6c 69 73 74 20 74 79  ..  /// <list ty
1490: 70 65 3d 22 6e 75 6d 62 65 72 65 64 22 3e 0d 0a  pe="numbered">..
14a0: 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 54 72 61 76    /// <item>Trav
14b0: 65 72 73 65 20 74 68 65 20 74 72 65 65 2c 20 70  erse the tree, p
14c0: 72 6f 64 75 63 69 6e 67 20 61 20 73 71 6c 20 62  roducing a sql b
14d0: 75 69 6c 64 65 72 20 3c 73 65 65 20 63 72 65 66  uilder <see cref
14e0: 3d 22 53 71 6c 42 75 69 6c 64 65 72 22 2f 3e 3c  ="SqlBuilder"/><
14f0: 2f 69 74 65 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 69  /item>..  /// <i
1500: 74 65 6d 3e 57 72 69 74 65 20 74 68 65 20 53 71  tem>Write the Sq
1510: 6c 42 75 69 6c 64 65 72 20 69 6e 74 6f 20 61 20  lBuilder into a 
1520: 73 74 72 69 6e 67 2c 20 72 65 6e 61 6d 69 6e 67  string, renaming
1530: 20 74 68 65 20 61 6c 69 61 73 65 73 20 61 6e 64   the aliases and
1540: 20 63 6f 6c 75 6d 6e 73 0d 0a 20 20 2f 2f 2f 20   columns..  /// 
1550: 61 73 20 6e 65 65 64 65 64 2e 3c 2f 69 74 65 6d  as needed.</item
1560: 3e 0d 0a 20 20 2f 2f 2f 20 3c 2f 6c 69 73 74 3e  >..  /// </list>
1570: 0d 0a 20 20 2f 2f 2f 0d 0a 20 20 2f 2f 2f 20 49  ..  ///..  /// I
1580: 6e 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  n the first phas
1590: 65 2c 20 77 65 20 74 72 61 76 65 72 73 65 20 74  e, we traverse t
15a0: 68 65 20 74 72 65 65 2e 20 20 57 65 20 63 61 6e  he tree.  We can
15b0: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 74 68 65  not generate the
15c0: 20 53 51 4c 20 73 74 72 69 6e 67 0d 0a 20 20 2f   SQL string..  /
15d0: 2f 2f 20 72 69 67 68 74 20 61 77 61 79 2c 20 73  // right away, s
15e0: 69 6e 63 65 0d 0a 20 20 2f 2f 2f 20 3c 6c 69 73  ince..  /// <lis
15f0: 74 20 74 79 70 65 3d 22 62 75 6c 6c 65 74 22 3e  t type="bullet">
1600: 0d 0a 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 54 68  ..  /// <item>Th
1610: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 68  e WHERE clause h
1620: 61 73 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  as to be visited
1630: 20 62 65 66 6f 72 65 20 74 68 65 20 66 72 6f 6d   before the from
1640: 20 63 6c 61 75 73 65 2e 3c 2f 69 74 65 6d 3e 0d   clause.</item>.
1650: 0a 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 65 78 74  .  /// <item>ext
1660: 65 6e 74 20 61 6c 69 61 73 65 73 20 61 6e 64 20  ent aliases and 
1670: 63 6f 6c 75 6d 6e 20 61 6c 69 61 73 65 73 20 6e  column aliases n
1680: 65 65 64 20 74 6f 20 62 65 20 72 65 6e 61 6d 65  eed to be rename
1690: 64 2e 20 20 54 6f 20 6d 69 6e 69 6d 69 7a 65 0d  d.  To minimize.
16a0: 0a 20 20 2f 2f 2f 20 72 65 6e 61 6d 69 6e 67 20  .  /// renaming 
16b0: 63 6f 6c 6c 69 73 69 6f 6e 73 2c 20 61 6c 6c 20  collisions, all 
16c0: 74 68 65 20 6e 61 6d 65 73 20 75 73 65 64 20 6d  the names used m
16d0: 75 73 74 20 62 65 20 6b 6e 6f 77 6e 2c 20 62 65  ust be known, be
16e0: 66 6f 72 65 20 61 6e 79 20 72 65 6e 61 6d 69 6e  fore any renamin
16f0: 67 0d 0a 20 20 2f 2f 2f 20 63 68 6f 69 63 65 20  g..  /// choice 
1700: 69 73 20 6d 61 64 65 2e 3c 2f 69 74 65 6d 3e 0d  is made.</item>.
1710: 0a 20 20 2f 2f 2f 20 3c 2f 6c 69 73 74 3e 0d 0a  .  /// </list>..
1720: 20 20 2f 2f 2f 20 54 6f 20 64 65 66 65 72 20 74    /// To defer t
1730: 68 65 20 72 65 6e 61 6d 69 6e 67 20 63 68 6f 69  he renaming choi
1740: 63 65 73 2c 20 77 65 20 75 73 65 20 73 79 6d 62  ces, we use symb
1750: 6f 6c 73 20 3c 73 65 65 20 63 72 65 66 3d 22 53  ols <see cref="S
1760: 79 6d 62 6f 6c 22 2f 3e 2e 20 20 54 68 65 73 65  ymbol"/>.  These
1770: 0d 0a 20 20 2f 2f 2f 20 61 72 65 20 72 65 6e 61  ..  /// are rena
1780: 6d 65 64 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  med in the secon
1790: 64 20 70 68 61 73 65 2e 0d 0a 20 20 2f 2f 2f 0d  d phase...  ///.
17a0: 0a 20 20 2f 2f 2f 20 53 69 6e 63 65 20 76 69 73  .  /// Since vis
17b0: 69 74 6f 72 20 6d 65 74 68 6f 64 73 20 63 61 6e  itor methods can
17c0: 6e 6f 74 20 74 72 61 6e 73 66 65 72 20 69 6e 66  not transfer inf
17d0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 68 69 6c  ormation to chil
17e0: 64 20 6e 6f 64 65 73 20 74 68 72 6f 75 67 68 0d  d nodes through.
17f0: 0a 20 20 2f 2f 2f 20 70 61 72 61 6d 65 74 65 72  .  /// parameter
1800: 73 2c 20 77 65 20 75 73 65 20 73 6f 6d 65 20 67  s, we use some g
1810: 6c 6f 62 61 6c 20 73 74 61 63 6b 73 2c 0d 0a 20  lobal stacks,.. 
1820: 20 2f 2f 2f 20 3c 6c 69 73 74 20 74 79 70 65 3d   /// <list type=
1830: 22 62 75 6c 6c 65 74 22 3e 0d 0a 20 20 2f 2f 2f  "bullet">..  ///
1840: 20 3c 69 74 65 6d 3e 41 20 73 74 61 63 6b 20 66   <item>A stack f
1850: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  or the current S
1860: 51 4c 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  QL select statem
1870: 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ent.  This is ne
1880: 65 64 65 64 20 62 79 0d 0a 20 20 2f 2f 2f 20 3c  eded by..  /// <
1890: 73 65 65 20 63 72 65 66 3d 22 53 71 6c 47 65 6e  see cref="SqlGen
18a0: 65 72 61 74 6f 72 2e 56 69 73 69 74 28 44 62 56  erator.Visit(DbV
18b0: 61 72 69 61 62 6c 65 52 65 66 65 72 65 6e 63 65  ariableReference
18c0: 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e 20 74  Expression)"/> t
18d0: 6f 20 63 72 65 61 74 65 20 61 0d 0a 20 20 2f 2f  o create a..  //
18e0: 2f 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 76  / list of free v
18f0: 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 62 79  ariables used by
1900: 20 61 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d   a select statem
1910: 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ent.  This is ne
1920: 65 64 65 64 20 66 6f 72 0d 0a 20 20 2f 2f 2f 20  eded for..  /// 
1930: 61 6c 69 61 73 20 72 65 6e 61 6d 69 6e 67 2e 0d  alias renaming..
1940: 0a 20 20 2f 2f 2f 20 3c 2f 69 74 65 6d 3e 0d 0a  .  /// </item>..
1950: 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 41 20 73 74    /// <item>A st
1960: 61 63 6b 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  ack for the join
1970: 20 63 6f 6e 74 65 78 74 2e 20 20 57 68 65 6e 20   context.  When 
1980: 76 69 73 69 74 69 6e 67 20 61 20 3c 73 65 65 20  visiting a <see 
1990: 63 72 65 66 3d 22 44 62 53 63 61 6e 45 78 70 72  cref="DbScanExpr
19a0: 65 73 73 69 6f 6e 22 2f 3e 2c 0d 0a 20 20 2f 2f  ession"/>,..  //
19b0: 2f 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  / we need to kno
19c0: 77 20 77 68 65 74 68 65 72 20 77 65 20 61 72 65  w whether we are
19d0: 20 69 6e 73 69 64 65 20 61 20 6a 6f 69 6e 20 6f   inside a join o
19e0: 72 20 6e 6f 74 2e 20 20 49 66 20 77 65 20 61 72  r not.  If we ar
19f0: 65 20 69 6e 73 69 64 65 0d 0a 20 20 2f 2f 2f 20  e inside..  /// 
1a00: 61 20 6a 6f 69 6e 2c 20 77 65 20 64 6f 20 6e 6f  a join, we do no
1a10: 74 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 53  t create a new S
1a20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1a30: 3c 2f 69 74 65 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c  </item>..  /// <
1a40: 2f 6c 69 73 74 3e 0d 0a 20 20 2f 2f 2f 20 3c 2f  /list>..  /// </
1a50: 70 61 72 61 3e 0d 0a 20 20 2f 2f 2f 0d 0a 20 20  para>..  ///..  
1a60: 2f 2f 2f 20 3c 70 61 72 61 3e 0d 0a 20 20 2f 2f  /// <para>..  //
1a70: 2f 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 2e 0d  / Global state..
1a80: 0a 20 20 2f 2f 2f 20 54 6f 20 65 6e 61 62 6c 65  .  /// To enable
1a90: 20 72 65 6e 61 6d 69 6e 67 2c 20 77 65 20 6d 61   renaming, we ma
1aa0: 69 6e 74 61 69 6e 0d 0a 20 20 2f 2f 2f 20 3c 6c  intain..  /// <l
1ab0: 69 73 74 20 74 79 70 65 3d 22 62 75 6c 6c 65 74  ist type="bullet
1ac0: 22 3e 0d 0a 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e  ">..  /// <item>
1ad0: 54 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 65  The set of all e
1ae0: 78 74 65 6e 74 20 61 6c 69 61 73 65 73 20 75 73  xtent aliases us
1af0: 65 64 2e 3c 2f 69 74 65 6d 3e 0d 0a 20 20 2f 2f  ed.</item>..  //
1b00: 2f 20 3c 69 74 65 6d 3e 54 68 65 20 73 65 74 20  / <item>The set 
1b10: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 61 6c  of all column al
1b20: 69 61 73 65 73 20 75 73 65 64 2e 3c 2f 69 74 65  iases used.</ite
1b30: 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 2f 6c 69 73 74  m>..  /// </list
1b40: 3e 0d 0a 20 20 2f 2f 2f 0d 0a 20 20 2f 2f 2f 20  >..  ///..  /// 
1b50: 46 69 6e 61 6c 6c 79 2c 20 77 65 20 68 61 76 65  Finally, we have
1b60: 20 61 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20   a symbol table 
1b70: 74 6f 20 6c 6f 6f 6b 75 70 20 76 61 72 69 61 62  to lookup variab
1b80: 6c 65 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  le references.  
1b90: 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 0d 0a  All references..
1ba0: 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 73 61 6d    /// to the sam
1bb0: 65 20 65 78 74 65 6e 74 20 68 61 76 65 20 74 68  e extent have th
1bc0: 65 20 73 61 6d 65 20 73 79 6d 62 6f 6c 2e 0d 0a  e same symbol...
1bd0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
1be0: 20 2f 2f 2f 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72   ///..  /// <par
1bf0: 61 3e 0d 0a 20 20 2f 2f 2f 20 53 71 6c 20 73 65  a>..  /// Sql se
1c00: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 73  lect statement s
1c10: 68 61 72 69 6e 67 2e 0d 0a 20 20 2f 2f 2f 0d 0a  haring...  ///..
1c20: 20 20 2f 2f 2f 20 45 61 63 68 20 6f 66 20 74 68    /// Each of th
1c30: 65 20 72 65 6c 61 74 69 6f 6e 61 6c 20 6f 70 65  e relational ope
1c40: 72 61 74 6f 72 20 6e 6f 64 65 73 0d 0a 20 20 2f  rator nodes..  /
1c50: 2f 2f 20 3c 6c 69 73 74 20 74 79 70 65 3d 22 62  // <list type="b
1c60: 75 6c 6c 65 74 22 3e 0d 0a 20 20 2f 2f 2f 20 3c  ullet">..  /// <
1c70: 69 74 65 6d 3e 50 72 6f 6a 65 63 74 3c 2f 69 74  item>Project</it
1c80: 65 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 69 74 65 6d  em>..  /// <item
1c90: 3e 46 69 6c 74 65 72 3c 2f 69 74 65 6d 3e 0d 0a  >Filter</item>..
1ca0: 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 47 72 6f 75    /// <item>Grou
1cb0: 70 42 79 3c 2f 69 74 65 6d 3e 0d 0a 20 20 2f 2f  pBy</item>..  //
1cc0: 2f 20 3c 69 74 65 6d 3e 53 6f 72 74 2f 4f 72 64  / <item>Sort/Ord
1cd0: 65 72 42 79 3c 2f 69 74 65 6d 3e 0d 0a 20 20 2f  erBy</item>..  /
1ce0: 2f 2f 20 3c 2f 6c 69 73 74 3e 0d 0a 20 20 2f 2f  // </list>..  //
1cf0: 2f 20 63 61 6e 20 61 64 64 20 69 74 73 20 6e 6f  / can add its no
1d00: 6e 2d 69 6e 70 75 74 20 28 65 2e 67 2e 20 70 72  n-input (e.g. pr
1d10: 6f 6a 65 63 74 2c 20 70 72 65 64 69 63 61 74 65  oject, predicate
1d20: 2c 20 73 6f 72 74 20 6f 72 64 65 72 20 65 74 63  , sort order etc
1d30: 2e 29 20 74 6f 0d 0a 20 20 2f 2f 2f 20 74 68 65  .) to..  /// the
1d40: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 66   SQL statement f
1d50: 6f 72 20 74 68 65 20 69 6e 70 75 74 2c 20 6f 72  or the input, or
1d60: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   create a new SQ
1d70: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20  L statement...  
1d80: 2f 2f 2f 20 49 66 20 69 74 20 63 68 6f 6f 73 65  /// If it choose
1d90: 73 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 69  s to reuse the i
1da0: 6e 70 75 74 27 73 20 53 51 4c 20 73 74 61 74 65  nput's SQL state
1db0: 6d 65 6e 74 2c 20 77 65 20 70 6c 61 79 20 74 68  ment, we play th
1dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0d 0a 20 20 2f  e following..  /
1dd0: 2f 2f 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  // symbol table 
1de0: 74 72 69 63 6b 20 74 6f 20 61 63 63 6f 6d 70 6c  trick to accompl
1df0: 69 73 68 20 72 65 6e 61 6d 69 6e 67 2e 20 20 54  ish renaming.  T
1e00: 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
1e10: 65 6e 74 72 79 20 66 6f 72 0d 0a 20 20 2f 2f 2f  entry for..  ///
1e20: 20 74 68 65 20 61 6c 69 61 73 20 6f 66 20 74 68   the alias of th
1e30: 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 70  e current node p
1e40: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 79 6d  oints to the sym
1e50: 62 6f 6c 20 66 6f 72 20 74 68 65 20 69 6e 70 75  bol for the inpu
1e60: 74 20 69 6e 0d 0a 20 20 2f 2f 2f 20 74 68 65 20  t in..  /// the 
1e70: 69 6e 70 75 74 27 73 20 53 51 4c 20 73 74 61 74  input's SQL stat
1e80: 65 6d 65 6e 74 2e 0d 0a 20 20 2f 2f 2f 20 3c 65  ement...  /// <e
1e90: 78 61 6d 70 6c 65 3e 0d 0a 20 20 2f 2f 2f 20 3c  xample>..  /// <
1ea0: 63 6f 64 65 3e 0d 0a 20 20 2f 2f 2f 20 50 72 6f  code>..  /// Pro
1eb0: 6a 65 63 74 28 62 2e 78 0d 0a 20 20 2f 2f 2f 20  ject(b.x..  /// 
1ec0: 20 20 20 20 62 20 3d 20 46 69 6c 74 65 72 28 0d      b = Filter(.
1ed0: 0a 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 63  .  ///         c
1ee0: 20 3d 20 45 78 74 65 6e 74 28 66 6f 6f 29 0d 0a   = Extent(foo)..
1ef0: 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 63 2e    ///         c.
1f00: 78 20 3d 20 35 29 0d 0a 20 20 2f 2f 2f 20 20 20  x = 5)..  ///   
1f10: 20 20 29 0d 0a 20 20 2f 2f 2f 20 3c 2f 63 6f 64    )..  /// </cod
1f20: 65 3e 0d 0a 20 20 2f 2f 2f 20 54 68 65 20 45 78  e>..  /// The Ex
1f30: 74 65 6e 74 20 6e 6f 64 65 20 63 72 65 61 74 65  tent node create
1f40: 73 20 61 20 6e 65 77 20 53 71 6c 53 65 6c 65 63  s a new SqlSelec
1f50: 74 53 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69  tStatement.  Thi
1f60: 73 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  s is added to th
1f70: 65 0d 0a 20 20 2f 2f 2f 20 73 79 6d 62 6f 6c 20  e..  /// symbol 
1f80: 74 61 62 6c 65 20 62 79 20 74 68 65 20 46 69 6c  table by the Fil
1f90: 74 65 72 20 61 73 20 7b 63 2c 20 53 79 6d 62 6f  ter as {c, Symbo
1fa0: 6c 28 63 29 7d 2e 20 20 54 68 75 73 2c 20 3c 63  l(c)}.  Thus, <c
1fb0: 3e 63 2e 78 3c 2f 63 3e 20 69 73 20 72 65 73 6f  >c.x</c> is reso
1fc0: 6c 76 65 64 20 74 6f 0d 0a 20 20 2f 2f 2f 20 3c  lved to..  /// <
1fd0: 63 3e 53 79 6d 62 6f 6c 28 63 29 2e 78 3c 2f 63  c>Symbol(c).x</c
1fe0: 3e 2e 0d 0a 20 20 2f 2f 2f 20 4c 6f 6f 6b 69 6e  >...  /// Lookin
1ff0: 67 20 61 74 20 74 68 65 20 70 72 6f 6a 65 63 74  g at the project
2000: 20 6e 6f 64 65 2c 20 77 65 20 61 64 64 20 7b 62   node, we add {b
2010: 2c 20 53 79 6d 62 6f 6c 28 63 29 7d 20 74 6f 20  , Symbol(c)} to 
2020: 74 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  the symbol table
2030: 20 69 66 20 74 68 65 0d 0a 20 20 2f 2f 2f 20 53   if the..  /// S
2040: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
2050: 72 65 75 73 65 64 2c 20 61 6e 64 20 7b 62 2c 20  reused, and {b, 
2060: 53 79 6d 62 6f 6c 28 62 29 7d 2c 20 69 66 20 74  Symbol(b)}, if t
2070: 68 65 72 65 20 69 73 20 6e 6f 20 72 65 75 73 65  here is no reuse
2080: 2e 0d 0a 20 20 2f 2f 2f 0d 0a 20 20 2f 2f 2f 20  ...  ///..  /// 
2090: 54 68 75 73 2c 20 3c 63 3e 62 2e 78 3c 2f 63 3e  Thus, <c>b.x</c>
20a0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
20b0: 3c 63 3e 53 79 6d 62 6f 6c 28 63 29 2e 78 3c 2f  <c>Symbol(c).x</
20c0: 63 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 72  c> if there is r
20d0: 65 75 73 65 2c 20 61 6e 64 20 74 6f 0d 0a 20 20  euse, and to..  
20e0: 2f 2f 2f 20 3c 63 3e 53 79 6d 62 6f 6c 28 62 29  /// <c>Symbol(b)
20f0: 2e 78 3c 2f 63 3e 20 69 66 20 74 68 65 72 65 20  .x</c> if there 
2100: 69 73 20 6e 6f 20 72 65 75 73 65 2e 0d 0a 20 20  is no reuse...  
2110: 2f 2f 2f 20 3c 2f 65 78 61 6d 70 6c 65 3e 0d 0a  /// </example>..
2120: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 3e 0d 0a 20    /// </para>.. 
2130: 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d   /// </remarks>.
2140: 0a 20 20 69 6e 74 65 72 6e 61 6c 20 73 65 61 6c  .  internal seal
2150: 65 64 20 63 6c 61 73 73 20 53 71 6c 47 65 6e 65  ed class SqlGene
2160: 72 61 74 6f 72 20 3a 20 44 62 45 78 70 72 65 73  rator : DbExpres
2170: 73 69 6f 6e 56 69 73 69 74 6f 72 3c 49 53 71 6c  sionVisitor<ISql
2180: 46 72 61 67 6d 65 6e 74 3e 0d 0a 20 20 7b 0d 0a  Fragment>..  {..
2190: 20 20 20 20 70 72 69 76 61 74 65 20 53 51 4c 69      private SQLi
21a0: 74 65 50 72 6f 76 69 64 65 72 4d 61 6e 69 66 65  teProviderManife
21b0: 73 74 20 5f 6d 61 6e 69 66 65 73 74 3b 0d 0a 0d  st _manifest;...
21c0: 0a 20 20 20 20 23 72 65 67 69 6f 6e 20 56 69 73  .    #region Vis
21d0: 69 74 6f 72 20 70 61 72 61 6d 65 74 65 72 20 73  itor parameter s
21e0: 74 61 63 6b 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c  tacks..    /// <
21f0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
2200: 2f 20 45 76 65 72 79 20 72 65 6c 61 74 69 6f 6e  / Every relation
2210: 61 6c 20 6e 6f 64 65 20 68 61 73 20 74 6f 20 70  al node has to p
2220: 61 73 73 20 69 74 73 20 53 45 4c 45 43 54 20 73  ass its SELECT s
2230: 74 61 74 65 6d 65 6e 74 20 74 6f 20 69 74 73 20  tatement to its 
2240: 63 68 69 6c 64 72 65 6e 0d 0a 20 20 20 20 2f 2f  children..    //
2250: 2f 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  / This allows th
2260: 65 6d 20 28 44 62 56 61 72 69 61 62 6c 65 52 65  em (DbVariableRe
2270: 66 65 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f  ferenceExpressio
2280: 6e 20 65 76 65 6e 74 75 61 6c 6c 79 29 20 74 6f  n eventually) to
2290: 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
22a0: 20 6f 66 0d 0a 20 20 20 20 2f 2f 2f 20 6f 75 74   of..    /// out
22b0: 65 72 20 65 78 74 65 6e 74 73 20 28 66 72 65 65  er extents (free
22c0: 20 76 61 72 69 61 62 6c 65 73 29 20 75 73 65 64   variables) used
22d0: 20 62 79 20 74 68 69 73 20 73 65 6c 65 63 74 20   by this select 
22e0: 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20  statement...    
22f0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
2300: 20 20 20 20 53 74 61 63 6b 3c 53 71 6c 53 65 6c      Stack<SqlSel
2310: 65 63 74 53 74 61 74 65 6d 65 6e 74 3e 20 73 65  ectStatement> se
2320: 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 53 74 61  lectStatementSta
2330: 63 6b 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ck;....    /// <
2340: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
2350: 2f 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  / The top of the
2360: 20 73 74 61 63 6b 0d 0a 20 20 20 20 2f 2f 2f 20   stack..    /// 
2370: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
2380: 70 72 69 76 61 74 65 20 53 71 6c 53 65 6c 65 63  private SqlSelec
2390: 74 53 74 61 74 65 6d 65 6e 74 20 43 75 72 72 65  tStatement Curre
23a0: 6e 74 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e  ntSelectStatemen
23b0: 74 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  t..    {..      
23c0: 2f 2f 20 54 68 65 72 65 20 69 73 20 61 6c 77 61  // There is alwa
23d0: 79 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 6e 20  ys something on 
23e0: 74 68 65 20 73 74 61 63 6b 2c 20 73 6f 20 77 65  the stack, so we
23f0: 20 63 61 6e 20 61 6c 77 61 79 73 20 50 65 65 6b   can always Peek
2400: 2e 0d 0a 20 20 20 20 20 20 67 65 74 20 7b 20 72  ...      get { r
2410: 65 74 75 72 6e 20 73 65 6c 65 63 74 53 74 61 74  eturn selectStat
2420: 65 6d 65 6e 74 53 74 61 63 6b 2e 50 65 65 6b 28  ementStack.Peek(
2430: 29 3b 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ); }..    }.... 
2440: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
2450: 0d 0a 20 20 20 20 2f 2f 2f 20 4e 65 73 74 65 64  ..    /// Nested
2460: 20 6a 6f 69 6e 73 20 61 6e 64 20 65 78 74 65 6e   joins and exten
2470: 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ts need to know 
2480: 77 68 65 74 68 65 72 20 74 68 65 79 20 73 68 6f  whether they sho
2490: 75 6c 64 20 63 72 65 61 74 65 0d 0a 20 20 20 20  uld create..    
24a0: 2f 2f 2f 20 61 20 6e 65 77 20 53 65 6c 65 63 74  /// a new Select
24b0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 72   statement, or r
24c0: 65 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 27  euse the parent'
24d0: 73 2e 20 20 54 68 69 73 20 66 6c 61 67 0d 0a 20  s.  This flag.. 
24e0: 20 20 20 2f 2f 2f 20 69 6e 64 69 63 61 74 65 73     /// indicates
24f0: 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61 72   whether the par
2500: 65 6e 74 20 69 73 20 61 20 6a 6f 69 6e 20 6f 72  ent is a join or
2510: 20 6e 6f 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c   not...    /// <
2520: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 53  /summary>..    S
2530: 74 61 63 6b 3c 62 6f 6f 6c 3e 20 69 73 50 61 72  tack<bool> isPar
2540: 65 6e 74 41 4a 6f 69 6e 53 74 61 63 6b 3b 0d 0a  entAJoinStack;..
2550: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
2560: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65  ry>..    /// The
2570: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
2580: 6b 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  k..    /// </sum
2590: 6d 61 72 79 3e 0d 0a 20 20 20 20 70 72 69 76 61  mary>..    priva
25a0: 74 65 20 62 6f 6f 6c 20 49 73 50 61 72 65 6e 74  te bool IsParent
25b0: 41 4a 6f 69 6e 0d 0a 20 20 20 20 7b 0d 0a 20 20  AJoin..    {..  
25c0: 20 20 20 20 2f 2f 20 54 68 65 72 65 20 6d 69 67      // There mig
25d0: 68 74 20 62 65 20 6e 6f 20 65 6e 74 72 79 20 6f  ht be no entry o
25e0: 6e 20 74 68 65 20 73 74 61 63 6b 20 69 66 20 61  n the stack if a
25f0: 20 4a 6f 69 6e 20 6e 6f 64 65 20 68 61 73 20 6e   Join node has n
2600: 65 76 65 72 0d 0a 20 20 20 20 20 20 2f 2f 20 62  ever..      // b
2610: 65 65 6e 20 73 65 65 6e 2c 20 73 6f 20 77 65 20  een seen, so we 
2620: 72 65 74 75 72 6e 20 66 61 6c 73 65 20 69 6e 20  return false in 
2630: 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20  that case...    
2640: 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 69    get { return i
2650: 73 50 61 72 65 6e 74 41 4a 6f 69 6e 53 74 61 63  sParentAJoinStac
2660: 6b 2e 43 6f 75 6e 74 20 3d 3d 20 30 20 3f 20 66  k.Count == 0 ? f
2670: 61 6c 73 65 20 3a 20 69 73 50 61 72 65 6e 74 41  alse : isParentA
2680: 4a 6f 69 6e 53 74 61 63 6b 2e 50 65 65 6b 28 29  JoinStack.Peek()
2690: 3b 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ; }..    }....  
26a0: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
26b0: 20 20 20 20 23 72 65 67 69 6f 6e 20 47 6c 6f 62      #region Glob
26c0: 61 6c 20 6c 69 73 74 73 20 61 6e 64 20 73 74 61  al lists and sta
26d0: 74 65 0d 0a 20 20 20 20 44 69 63 74 69 6f 6e 61  te..    Dictiona
26e0: 72 79 3c 73 74 72 69 6e 67 2c 20 69 6e 74 3e 20  ry<string, int> 
26f0: 61 6c 6c 45 78 74 65 6e 74 4e 61 6d 65 73 3b 0d  allExtentNames;.
2700: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 44 69  .    internal Di
2710: 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c  ctionary<string,
2720: 20 69 6e 74 3e 20 41 6c 6c 45 78 74 65 6e 74 4e   int> AllExtentN
2730: 61 6d 65 73 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ames..    {..   
2740: 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20     get { return 
2750: 61 6c 6c 45 78 74 65 6e 74 4e 61 6d 65 73 3b 20  allExtentNames; 
2760: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
2770: 2f 2f 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75  // For each colu
2780: 6d 6e 20 6e 61 6d 65 2c 20 77 65 20 73 74 6f 72  mn name, we stor
2790: 65 20 74 68 65 20 6c 61 73 74 20 69 6e 74 65 67  e the last integ
27a0: 65 72 20 73 75 66 66 69 78 20 74 68 61 74 0d 0a  er suffix that..
27b0: 20 20 20 20 2f 2f 20 77 61 73 20 61 64 64 65 64      // was added
27c0: 20 74 6f 20 70 72 6f 64 75 63 65 20 61 20 75 6e   to produce a un
27d0: 69 71 75 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ique column name
27e0: 2e 20 20 54 68 69 73 20 73 70 65 65 64 73 20 75  .  This speeds u
27f0: 70 0d 0a 20 20 20 20 2f 2f 20 74 68 65 20 63 72  p..    // the cr
2800: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  eation of the ne
2810: 78 74 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66  xt unique name f
2820: 6f 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6e  or this column n
2830: 61 6d 65 2e 0d 0a 20 20 20 20 44 69 63 74 69 6f  ame...    Dictio
2840: 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 69 6e 74  nary<string, int
2850: 3e 20 61 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65 73  > allColumnNames
2860: 3b 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ;..    internal 
2870: 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e  Dictionary<strin
2880: 67 2c 20 69 6e 74 3e 20 41 6c 6c 43 6f 6c 75 6d  g, int> AllColum
2890: 6e 4e 61 6d 65 73 0d 0a 20 20 20 20 7b 0d 0a 20  nNames..    {.. 
28a0: 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72       get { retur
28b0: 6e 20 61 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65 73  n allColumnNames
28c0: 3b 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ; }..    }....  
28d0: 20 20 53 79 6d 62 6f 6c 54 61 62 6c 65 20 73 79    SymbolTable sy
28e0: 6d 62 6f 6c 54 61 62 6c 65 20 3d 20 6e 65 77 20  mbolTable = new 
28f0: 53 79 6d 62 6f 6c 54 61 62 6c 65 28 29 3b 0d 0a  SymbolTable();..
2900: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
2910: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 56 61 72  ry>..    /// Var
2920: 69 61 62 6c 65 52 65 66 65 72 65 6e 63 65 45 78  iableReferenceEx
2930: 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61 6c  pressions are al
2940: 6c 6f 77 65 64 20 6f 6e 6c 79 20 61 73 20 63 68  lowed only as ch
2950: 69 6c 64 72 65 6e 20 6f 66 20 44 62 50 72 6f 70  ildren of DbProp
2960: 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e 0d 0a  ertyExpression..
2970: 20 20 20 20 2f 2f 2f 20 6f 72 20 4d 65 74 68 6f      /// or Metho
2980: 64 45 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68  dExpression.  Th
2990: 65 20 63 68 65 61 70 65 73 74 20 77 61 79 20 74  e cheapest way t
29a0: 6f 20 65 6e 73 75 72 65 20 74 68 69 73 20 69 73  o ensure this is
29b0: 20 74 6f 20 73 65 74 20 74 68 65 20 66 6f 6c 6c   to set the foll
29c0: 6f 77 69 6e 67 0d 0a 20 20 20 20 2f 2f 2f 20 70  owing..    /// p
29d0: 72 6f 70 65 72 74 79 20 69 6e 20 44 62 56 61 72  roperty in DbVar
29e0: 69 61 62 6c 65 52 65 66 65 72 65 6e 63 65 45 78  iableReferenceEx
29f0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 72 65 73  pression and res
2a00: 65 74 20 69 74 20 69 6e 20 74 68 65 20 61 6c 6c  et it in the all
2a10: 6f 77 65 64 20 70 61 72 65 6e 74 20 65 78 70 72  owed parent expr
2a20: 65 73 73 69 6f 6e 73 2e 0d 0a 20 20 20 20 2f 2f  essions...    //
2a30: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
2a40: 20 20 62 6f 6f 6c 20 69 73 56 61 72 52 65 66 53    bool isVarRefS
2a50: 69 6e 67 6c 65 20 3d 20 66 61 6c 73 65 3b 0d 0a  ingle = false;..
2a60: 0d 0a 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e  ..    #endregion
2a70: 0d 0a 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  ....    private 
2a80: 62 6f 6f 6c 20 48 61 73 42 75 69 6c 74 4d 61 70  bool HasBuiltMap
2a90: 46 6f 72 49 6e 28 44 62 45 78 70 72 65 73 73 69  ForIn(DbExpressi
2aa0: 6f 6e 20 65 2c 20 4b 65 79 54 6f 4c 69 73 74 4d  on e, KeyToListM
2ab0: 61 70 3c 44 62 45 78 70 72 65 73 73 69 6f 6e 2c  ap<DbExpression,
2ac0: 20 44 62 45 78 70 72 65 73 73 69 6f 6e 3e 20 76   DbExpression> v
2ad0: 61 6c 75 65 73 29 0d 0a 20 20 20 20 7b 0d 0a 20  alues)..    {.. 
2ae0: 20 20 20 20 20 44 62 45 78 70 72 65 73 73 69 6f       DbExpressio
2af0: 6e 4b 69 6e 64 20 65 78 70 72 65 73 73 69 6f 6e  nKind expression
2b00: 4b 69 6e 64 20 3d 20 65 2e 45 78 70 72 65 73 73  Kind = e.Express
2b10: 69 6f 6e 4b 69 6e 64 3b 0d 0a 20 20 20 20 20 20  ionKind;..      
2b20: 69 66 20 28 65 78 70 72 65 73 73 69 6f 6e 4b 69  if (expressionKi
2b30: 6e 64 20 21 3d 20 44 62 45 78 70 72 65 73 73 69  nd != DbExpressi
2b40: 6f 6e 4b 69 6e 64 2e 45 71 75 61 6c 73 29 0d 0a  onKind.Equals)..
2b50: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2b60: 20 69 66 20 28 65 78 70 72 65 73 73 69 6f 6e 4b   if (expressionK
2b70: 69 6e 64 20 21 3d 20 44 62 45 78 70 72 65 73 73  ind != DbExpress
2b80: 69 6f 6e 4b 69 6e 64 2e 49 73 4e 75 6c 6c 29 0d  ionKind.IsNull).
2b90: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
2ba0: 20 20 20 20 20 20 69 66 20 28 65 78 70 72 65 73        if (expres
2bb0: 73 69 6f 6e 4b 69 6e 64 20 21 3d 20 44 62 45 78  sionKind != DbEx
2bc0: 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 4f 72 29  pressionKind.Or)
2bd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
2be0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2bf0: 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
2c00: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2c10: 20 44 62 42 69 6e 61 72 79 45 78 70 72 65 73 73   DbBinaryExpress
2c20: 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 32 20  ion expression2 
2c30: 3d 20 65 20 61 73 20 44 62 42 69 6e 61 72 79 45  = e as DbBinaryE
2c40: 78 70 72 65 73 73 69 6f 6e 3b 0d 0a 20 20 20 20  xpression;..    
2c50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 74 68        return (th
2c60: 69 73 2e 48 61 73 42 75 69 6c 74 4d 61 70 46 6f  is.HasBuiltMapFo
2c70: 72 49 6e 28 65 78 70 72 65 73 73 69 6f 6e 32 2e  rIn(expression2.
2c80: 4c 65 66 74 2c 20 76 61 6c 75 65 73 29 20 26 26  Left, values) &&
2c90: 20 74 68 69 73 2e 48 61 73 42 75 69 6c 74 4d 61   this.HasBuiltMa
2ca0: 70 46 6f 72 49 6e 28 65 78 70 72 65 73 73 69 6f  pForIn(expressio
2cb0: 6e 32 2e 52 69 67 68 74 2c 20 76 61 6c 75 65 73  n2.Right, values
2cc0: 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ));..        }..
2cd0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 65        }..      e
2ce0: 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  lse..      {..  
2cf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 69        return thi
2d00: 73 2e 54 72 79 41 64 64 45 78 70 72 65 73 73 69  s.TryAddExpressi
2d10: 6f 6e 46 6f 72 49 6e 28 28 44 62 42 69 6e 61 72  onForIn((DbBinar
2d20: 79 45 78 70 72 65 73 73 69 6f 6e 29 65 2c 20 76  yExpression)e, v
2d30: 61 6c 75 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d  alues);..      }
2d40: 0d 0a 20 20 20 20 20 20 44 62 45 78 70 72 65 73  ..      DbExpres
2d50: 73 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 3d 20  sion argument = 
2d60: 28 28 44 62 49 73 4e 75 6c 6c 45 78 70 72 65 73  ((DbIsNullExpres
2d70: 73 69 6f 6e 29 65 29 2e 41 72 67 75 6d 65 6e 74  sion)e).Argument
2d80: 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 74 68 69  ;..      if (thi
2d90: 73 2e 49 73 4b 65 79 46 6f 72 49 6e 28 61 72 67  s.IsKeyForIn(arg
2da0: 75 6d 65 6e 74 29 29 0d 0a 20 20 20 20 20 20 7b  ument))..      {
2db0: 0d 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65 73  ..        values
2dc0: 2e 41 64 64 28 61 72 67 75 6d 65 6e 74 2c 20 65  .Add(argument, e
2dd0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  );..        retu
2de0: 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
2df0: 7d 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  }..      return 
2e00: 66 61 6c 73 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  false;..    }...
2e10: 0a 20 20 20 20 23 72 65 67 69 6f 6e 20 53 74 61  .    #region Sta
2e20: 74 69 63 73 0d 0a 20 20 20 20 73 74 61 74 69 63  tics..    static
2e30: 20 70 72 69 76 61 74 65 20 72 65 61 64 6f 6e 6c   private readonl
2e40: 79 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72  y Dictionary<str
2e50: 69 6e 67 2c 20 46 75 6e 63 74 69 6f 6e 48 61 6e  ing, FunctionHan
2e60: 64 6c 65 72 3e 20 5f 62 75 69 6c 74 49 6e 46 75  dler> _builtInFu
2e70: 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 20 3d  nctionHandlers =
2e80: 20 49 6e 69 74 69 61 6c 69 7a 65 42 75 69 6c 74   InitializeBuilt
2e90: 49 6e 46 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65  InFunctionHandle
2ea0: 72 73 28 29 3b 0d 0a 20 20 20 20 73 74 61 74 69  rs();..    stati
2eb0: 63 20 70 72 69 76 61 74 65 20 72 65 61 64 6f 6e  c private readon
2ec0: 6c 79 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74  ly Dictionary<st
2ed0: 72 69 6e 67 2c 20 46 75 6e 63 74 69 6f 6e 48 61  ring, FunctionHa
2ee0: 6e 64 6c 65 72 3e 20 5f 63 61 6e 6f 6e 69 63 61  ndler> _canonica
2ef0: 6c 46 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72  lFunctionHandler
2f00: 73 20 3d 20 49 6e 69 74 69 61 6c 69 7a 65 43 61  s = InitializeCa
2f10: 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 48  nonicalFunctionH
2f20: 61 6e 64 6c 65 72 73 28 29 3b 0d 0a 20 20 20 20  andlers();..    
2f30: 73 74 61 74 69 63 20 70 72 69 76 61 74 65 20 72  static private r
2f40: 65 61 64 6f 6e 6c 79 20 44 69 63 74 69 6f 6e 61  eadonly Dictiona
2f50: 72 79 3c 73 74 72 69 6e 67 2c 20 73 74 72 69 6e  ry<string, strin
2f60: 67 3e 20 5f 66 75 6e 63 74 69 6f 6e 4e 61 6d 65  g> _functionName
2f70: 54 6f 4f 70 65 72 61 74 6f 72 44 69 63 74 69 6f  ToOperatorDictio
2f80: 6e 61 72 79 20 3d 20 49 6e 69 74 69 61 6c 69 7a  nary = Initializ
2f90: 65 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 54 6f 4f  eFunctionNameToO
2fa0: 70 65 72 61 74 6f 72 44 69 63 74 69 6f 6e 61 72  peratorDictionar
2fb0: 79 28 29 3b 0d 0a 20 20 20 20 73 74 61 74 69 63  y();..    static
2fc0: 20 70 72 69 76 61 74 65 20 72 65 61 64 6f 6e 6c   private readonl
2fd0: 79 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72  y Dictionary<str
2fe0: 69 6e 67 2c 20 73 74 72 69 6e 67 3e 20 5f 64 61  ing, string> _da
2ff0: 74 65 70 61 72 74 4b 65 79 77 6f 72 64 73 20 3d  tepartKeywords =
3000: 20 49 6e 69 74 69 61 6c 69 7a 65 44 61 74 65 70   InitializeDatep
3010: 61 72 74 4b 65 79 77 6f 72 64 73 28 29 3b 0d 0a  artKeywords();..
3020: 20 20 20 20 73 74 61 74 69 63 20 70 72 69 76 61      static priva
3030: 74 65 20 72 65 61 64 6f 6e 6c 79 20 63 68 61 72  te readonly char
3040: 5b 5d 20 68 65 78 44 69 67 69 74 73 20 3d 20 7b  [] hexDigits = {
3050: 20 27 30 27 2c 20 27 31 27 2c 20 27 32 27 2c 20   '0', '1', '2', 
3060: 27 33 27 2c 20 27 34 27 2c 20 27 35 27 2c 20 27  '3', '4', '5', '
3070: 36 27 2c 20 27 37 27 2c 20 27 38 27 2c 20 27 39  6', '7', '8', '9
3080: 27 2c 20 27 41 27 2c 20 27 42 27 2c 20 27 43 27  ', 'A', 'B', 'C'
3090: 2c 20 27 44 27 2c 20 27 45 27 2c 20 27 46 27 20  , 'D', 'E', 'F' 
30a0: 7d 3b 0d 0a 0d 0a 20 20 20 20 70 72 69 76 61 74  };....    privat
30b0: 65 20 64 65 6c 65 67 61 74 65 20 49 53 71 6c 46  e delegate ISqlF
30c0: 72 61 67 6d 65 6e 74 20 46 75 6e 63 74 69 6f 6e  ragment Function
30d0: 48 61 6e 64 6c 65 72 28 53 71 6c 47 65 6e 65 72  Handler(SqlGener
30e0: 61 74 6f 72 20 73 71 6c 67 65 6e 2c 20 44 62 46  ator sqlgen, DbF
30f0: 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f  unctionExpressio
3100: 6e 20 66 75 6e 63 74 69 6f 6e 45 78 70 72 29 3b  n functionExpr);
3110: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
3120: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41  mary>..    /// A
3130: 6c 6c 20 73 70 65 63 69 61 6c 20 62 75 69 6c 74  ll special built
3140: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  -in functions an
3150: 64 20 74 68 65 69 72 20 68 61 6e 64 6c 65 72 73  d their handlers
3160: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
3170: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ary>..    /// <r
3180: 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73  eturns></returns
3190: 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  >..    private s
31a0: 74 61 74 69 63 20 44 69 63 74 69 6f 6e 61 72 79  tatic Dictionary
31b0: 3c 73 74 72 69 6e 67 2c 20 46 75 6e 63 74 69 6f  <string, Functio
31c0: 6e 48 61 6e 64 6c 65 72 3e 20 49 6e 69 74 69 61  nHandler> Initia
31d0: 6c 69 7a 65 42 75 69 6c 74 49 6e 46 75 6e 63 74  lizeBuiltInFunct
31e0: 69 6f 6e 48 61 6e 64 6c 65 72 73 28 29 0d 0a 20  ionHandlers().. 
31f0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 44 69 63 74     {..      Dict
3200: 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 46  ionary<string, F
3210: 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 3e 20  unctionHandler> 
3220: 66 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73  functionHandlers
3230: 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e 61 72   = new Dictionar
3240: 79 3c 73 74 72 69 6e 67 2c 20 46 75 6e 63 74 69  y<string, Functi
3250: 6f 6e 48 61 6e 64 6c 65 72 3e 28 37 2c 20 53 74  onHandler>(7, St
3260: 72 69 6e 67 43 6f 6d 70 61 72 65 72 2e 4f 72 64  ringComparer.Ord
3270: 69 6e 61 6c 29 3b 0d 0a 20 20 20 20 20 20 66 75  inal);..      fu
3280: 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41  nctionHandlers.A
3290: 64 64 28 22 43 4f 4e 43 41 54 22 2c 20 48 61 6e  dd("CONCAT", Han
32a0: 64 6c 65 43 6f 6e 63 61 74 46 75 6e 63 74 69 6f  dleConcatFunctio
32b0: 6e 29 3b 0d 0a 20 20 20 20 20 20 66 75 6e 63 74  n);..      funct
32c0: 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41 64 64 28  ionHandlers.Add(
32d0: 22 44 41 54 45 50 41 52 54 22 2c 20 48 61 6e 64  "DATEPART", Hand
32e0: 6c 65 44 61 74 65 70 61 72 74 44 61 74 65 46 75  leDatepartDateFu
32f0: 6e 63 74 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20  nction);..      
3300: 66 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73  functionHandlers
3310: 2e 41 64 64 28 22 44 61 74 65 50 61 72 74 22 2c  .Add("DatePart",
3320: 20 48 61 6e 64 6c 65 44 61 74 65 70 61 72 74 44   HandleDatepartD
3330: 61 74 65 46 75 6e 63 74 69 6f 6e 29 3b 0d 0a 20  ateFunction);.. 
3340: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61 6e       functionHan
3350: 64 6c 65 72 73 2e 41 64 64 28 22 47 45 54 44 41  dlers.Add("GETDA
3360: 54 45 22 2c 20 48 61 6e 64 6c 65 47 65 74 44 61  TE", HandleGetDa
3370: 74 65 46 75 6e 63 74 69 6f 6e 29 3b 0d 0a 20 20  teFunction);..  
3380: 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61 6e 64      functionHand
3390: 6c 65 72 73 2e 41 64 64 28 22 47 45 54 55 54 43  lers.Add("GETUTC
33a0: 44 41 54 45 22 2c 20 48 61 6e 64 6c 65 47 65 74  DATE", HandleGet
33b0: 55 74 63 44 61 74 65 46 75 6e 63 74 69 6f 6e 29  UtcDateFunction)
33c0: 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
33d0: 66 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73  functionHandlers
33e0: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
33f0: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
3400: 20 20 20 2f 2f 2f 20 41 6c 6c 20 73 70 65 63 69     /// All speci
3410: 61 6c 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  al non-aggregate
3420: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 75 6e 63 74   canonical funct
3430: 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 68  ions and their h
3440: 61 6e 64 6c 65 72 73 0d 0a 20 20 20 20 2f 2f 2f  andlers..    ///
3450: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
3460: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f   /// <returns></
3470: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 72  returns>..    pr
3480: 69 76 61 74 65 20 73 74 61 74 69 63 20 44 69 63  ivate static Dic
3490: 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20  tionary<string, 
34a0: 46 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 3e  FunctionHandler>
34b0: 20 49 6e 69 74 69 61 6c 69 7a 65 43 61 6e 6f 6e   InitializeCanon
34c0: 69 63 61 6c 46 75 6e 63 74 69 6f 6e 48 61 6e 64  icalFunctionHand
34d0: 6c 65 72 73 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  lers()..    {.. 
34e0: 20 20 20 20 20 44 69 63 74 69 6f 6e 61 72 79 3c       Dictionary<
34f0: 73 74 72 69 6e 67 2c 20 46 75 6e 63 74 69 6f 6e  string, Function
3500: 48 61 6e 64 6c 65 72 3e 20 66 75 6e 63 74 69 6f  Handler> functio
3510: 6e 48 61 6e 64 6c 65 72 73 20 3d 20 6e 65 77 20  nHandlers = new 
3520: 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e  Dictionary<strin
3530: 67 2c 20 46 75 6e 63 74 69 6f 6e 48 61 6e 64 6c  g, FunctionHandl
3540: 65 72 3e 28 31 36 2c 20 53 74 72 69 6e 67 43 6f  er>(16, StringCo
3550: 6d 70 61 72 65 72 2e 4f 72 64 69 6e 61 6c 29 3b  mparer.Ordinal);
3560: 0d 0a 0d 0a 23 69 66 20 55 53 45 5f 49 4e 54 45  ....#if USE_INTE
3570: 52 4f 50 5f 44 4c 4c 20 26 26 20 49 4e 54 45 52  ROP_DLL && INTER
3580: 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
3590: 43 54 49 4f 4e 53 0d 0a 20 20 20 20 20 20 66 75  CTIONS..      fu
35a0: 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41  nctionHandlers.A
35b0: 64 64 28 22 49 6e 64 65 78 4f 66 22 2c 20 48 61  dd("IndexOf", Ha
35c0: 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e  ndleCanonicalFun
35d0: 63 74 69 6f 6e 49 6e 64 65 78 4f 66 29 3b 0d 0a  ctionIndexOf);..
35e0: 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 20 20 20 20  #endif....      
35f0: 66 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73  functionHandlers
3600: 2e 41 64 64 28 22 4c 65 6e 67 74 68 22 2c 20 48  .Add("Length", H
3610: 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75  andleCanonicalFu
3620: 6e 63 74 69 6f 6e 4c 65 6e 67 74 68 29 3b 0d 0a  nctionLength);..
3630: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61        functionHa
3640: 6e 64 6c 65 72 73 2e 41 64 64 28 22 4e 65 77 47  ndlers.Add("NewG
3650: 75 69 64 22 2c 20 48 61 6e 64 6c 65 43 61 6e 6f  uid", HandleCano
3660: 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 4e 65 77  nicalFunctionNew
3670: 47 75 69 64 29 3b 0d 0a 20 20 20 20 20 20 66 75  Guid);..      fu
3680: 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41  nctionHandlers.A
3690: 64 64 28 22 52 6f 75 6e 64 22 2c 20 48 61 6e 64  dd("Round", Hand
36a0: 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e 63 74  leCanonicalFunct
36b0: 69 6f 6e 52 6f 75 6e 64 29 3b 0d 0a 20 20 20 20  ionRound);..    
36c0: 20 20 66 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65    functionHandle
36d0: 72 73 2e 41 64 64 28 22 54 6f 4c 6f 77 65 72 22  rs.Add("ToLower"
36e0: 2c 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61  , HandleCanonica
36f0: 6c 46 75 6e 63 74 69 6f 6e 54 6f 4c 6f 77 65 72  lFunctionToLower
3700: 29 3b 0d 0a 20 20 20 20 20 20 66 75 6e 63 74 69  );..      functi
3710: 6f 6e 48 61 6e 64 6c 65 72 73 2e 41 64 64 28 22  onHandlers.Add("
3720: 54 6f 55 70 70 65 72 22 2c 20 48 61 6e 64 6c 65  ToUpper", Handle
3730: 43 61 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f  CanonicalFunctio
3740: 6e 54 6f 55 70 70 65 72 29 3b 0d 0a 20 20 20 20  nToUpper);..    
3750: 20 20 66 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65    functionHandle
3760: 72 73 2e 41 64 64 28 22 54 72 69 6d 22 2c 20 48  rs.Add("Trim", H
3770: 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75  andleCanonicalFu
3780: 6e 63 74 69 6f 6e 54 72 69 6d 29 3b 0d 0a 20 20  nctionTrim);..  
3790: 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61 6e 64      functionHand
37a0: 6c 65 72 73 2e 41 64 64 28 22 4c 65 66 74 22 2c  lers.Add("Left",
37b0: 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c   HandleCanonical
37c0: 46 75 6e 63 74 69 6f 6e 4c 65 66 74 29 3b 0d 0a  FunctionLeft);..
37d0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61        functionHa
37e0: 6e 64 6c 65 72 73 2e 41 64 64 28 22 52 69 67 68  ndlers.Add("Righ
37f0: 74 22 2c 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69  t", HandleCanoni
3800: 63 61 6c 46 75 6e 63 74 69 6f 6e 52 69 67 68 74  calFunctionRight
3810: 29 3b 0d 0a 20 20 20 20 20 20 66 75 6e 63 74 69  );..      functi
3820: 6f 6e 48 61 6e 64 6c 65 72 73 2e 41 64 64 28 22  onHandlers.Add("
3830: 53 75 62 73 74 72 69 6e 67 22 2c 20 48 61 6e 64  Substring", Hand
3840: 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e 63 74  leCanonicalFunct
3850: 69 6f 6e 53 75 62 73 74 72 69 6e 67 29 3b 0d 0a  ionSubstring);..
3860: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61        functionHa
3870: 6e 64 6c 65 72 73 2e 41 64 64 28 22 43 75 72 72  ndlers.Add("Curr
3880: 65 6e 74 44 61 74 65 54 69 6d 65 22 2c 20 48 61  entDateTime", Ha
3890: 6e 64 6c 65 47 65 74 44 61 74 65 46 75 6e 63 74  ndleGetDateFunct
38a0: 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 66 75 6e  ion);..      fun
38b0: 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41 64  ctionHandlers.Ad
38c0: 64 28 22 43 75 72 72 65 6e 74 55 74 63 44 61 74  d("CurrentUtcDat
38d0: 65 54 69 6d 65 22 2c 20 48 61 6e 64 6c 65 47 65  eTime", HandleGe
38e0: 74 55 74 63 44 61 74 65 46 75 6e 63 74 69 6f 6e  tUtcDateFunction
38f0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 44 61  );....      //Da
3900: 74 65 50 61 72 74 46 75 6e 63 74 69 6f 6e 73 0d  tePartFunctions.
3910: 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48  .      functionH
3920: 61 6e 64 6c 65 72 73 2e 41 64 64 28 22 59 65 61  andlers.Add("Yea
3930: 72 22 2c 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69  r", HandleCanoni
3940: 63 61 6c 46 75 6e 63 74 69 6f 6e 44 61 74 65 70  calFunctionDatep
3950: 61 72 74 29 3b 0d 0a 20 20 20 20 20 20 66 75 6e  art);..      fun
3960: 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41 64  ctionHandlers.Ad
3970: 64 28 22 4d 6f 6e 74 68 22 2c 20 48 61 6e 64 6c  d("Month", Handl
3980: 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69  eCanonicalFuncti
3990: 6f 6e 44 61 74 65 70 61 72 74 29 3b 0d 0a 20 20  onDatepart);..  
39a0: 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61 6e 64      functionHand
39b0: 6c 65 72 73 2e 41 64 64 28 22 44 61 79 22 2c 20  lers.Add("Day", 
39c0: 48 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46  HandleCanonicalF
39d0: 75 6e 63 74 69 6f 6e 44 61 74 65 70 61 72 74 29  unctionDatepart)
39e0: 3b 0d 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  ;..      functio
39f0: 6e 48 61 6e 64 6c 65 72 73 2e 41 64 64 28 22 48  nHandlers.Add("H
3a00: 6f 75 72 22 2c 20 48 61 6e 64 6c 65 43 61 6e 6f  our", HandleCano
3a10: 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 44 61 74  nicalFunctionDat
3a20: 65 70 61 72 74 29 3b 0d 0a 20 20 20 20 20 20 66  epart);..      f
3a30: 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e  unctionHandlers.
3a40: 41 64 64 28 22 4d 69 6e 75 74 65 22 2c 20 48 61  Add("Minute", Ha
3a50: 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e  ndleCanonicalFun
3a60: 63 74 69 6f 6e 44 61 74 65 70 61 72 74 29 3b 0d  ctionDatepart);.
3a70: 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48  .      functionH
3a80: 61 6e 64 6c 65 72 73 2e 41 64 64 28 22 53 65 63  andlers.Add("Sec
3a90: 6f 6e 64 22 2c 20 48 61 6e 64 6c 65 43 61 6e 6f  ond", HandleCano
3aa0: 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 44 61 74  nicalFunctionDat
3ab0: 65 70 61 72 74 29 3b 0d 0a 20 20 20 20 20 20 66  epart);..      f
3ac0: 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e  unctionHandlers.
3ad0: 41 64 64 28 22 44 61 74 65 41 64 64 22 2c 20 48  Add("DateAdd", H
3ae0: 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75  andleCanonicalFu
3af0: 6e 63 74 69 6f 6e 44 61 74 65 41 64 64 29 3b 0d  nctionDateAdd);.
3b00: 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48  .      functionH
3b10: 61 6e 64 6c 65 72 73 2e 41 64 64 28 22 44 61 74  andlers.Add("Dat
3b20: 65 44 69 66 66 22 2c 20 48 61 6e 64 6c 65 43 61  eDiff", HandleCa
3b30: 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 44  nonicalFunctionD
3b40: 61 74 65 53 75 62 74 72 61 63 74 29 3b 0d 0a 20  ateSubtract);.. 
3b50: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61 6e       functionHan
3b60: 64 6c 65 72 73 2e 41 64 64 28 22 44 41 54 45 41  dlers.Add("DATEA
3b70: 44 44 22 2c 20 48 61 6e 64 6c 65 43 61 6e 6f 6e  DD", HandleCanon
3b80: 69 63 61 6c 46 75 6e 63 74 69 6f 6e 44 61 74 65  icalFunctionDate
3b90: 41 64 64 29 3b 20 2f 2f 20 73 74 6f 72 65 0d 0a  Add); // store..
3ba0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61        functionHa
3bb0: 6e 64 6c 65 72 73 2e 41 64 64 28 22 44 41 54 45  ndlers.Add("DATE
3bc0: 44 49 46 46 22 2c 20 48 61 6e 64 6c 65 43 61 6e  DIFF", HandleCan
3bd0: 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 44 61  onicalFunctionDa
3be0: 74 65 53 75 62 74 72 61 63 74 29 3b 20 2f 2f 20  teSubtract); // 
3bf0: 73 74 6f 72 65 0d 0a 0d 0a 20 20 20 20 20 20 2f  store....      /
3c00: 2f 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20  /Functions that 
3c10: 74 72 61 6e 73 6c 61 74 65 20 74 6f 20 6f 70 65  translate to ope
3c20: 72 61 74 6f 72 73 0d 0a 20 20 20 20 20 20 66 75  rators..      fu
3c30: 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41  nctionHandlers.A
3c40: 64 64 28 22 43 6f 6e 63 61 74 22 2c 20 48 61 6e  dd("Concat", Han
3c50: 64 6c 65 43 6f 6e 63 61 74 46 75 6e 63 74 69 6f  dleConcatFunctio
3c60: 6e 29 3b 0d 0a 20 20 20 20 20 20 66 75 6e 63 74  n);..      funct
3c70: 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41 64 64 28  ionHandlers.Add(
3c80: 22 42 69 74 77 69 73 65 41 6e 64 22 2c 20 48 61  "BitwiseAnd", Ha
3c90: 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e  ndleCanonicalFun
3ca0: 63 74 69 6f 6e 42 69 74 77 69 73 65 29 3b 0d 0a  ctionBitwise);..
3cb0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 48 61        functionHa
3cc0: 6e 64 6c 65 72 73 2e 41 64 64 28 22 42 69 74 77  ndlers.Add("Bitw
3cd0: 69 73 65 4e 6f 74 22 2c 20 48 61 6e 64 6c 65 43  iseNot", HandleC
3ce0: 61 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e  anonicalFunction
3cf0: 42 69 74 77 69 73 65 29 3b 0d 0a 20 20 20 20 20  Bitwise);..     
3d00: 20 66 75 6e 63 74 69 6f 6e 48 61 6e 64 6c 65 72   functionHandler
3d10: 73 2e 41 64 64 28 22 42 69 74 77 69 73 65 4f 72  s.Add("BitwiseOr
3d20: 22 2c 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69 63  ", HandleCanonic
3d30: 61 6c 46 75 6e 63 74 69 6f 6e 42 69 74 77 69 73  alFunctionBitwis
3d40: 65 29 3b 0d 0a 20 20 20 20 20 20 66 75 6e 63 74  e);..      funct
3d50: 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 41 64 64 28  ionHandlers.Add(
3d60: 22 42 69 74 77 69 73 65 58 6f 72 22 2c 20 48 61  "BitwiseXor", Ha
3d70: 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e  ndleCanonicalFun
3d80: 63 74 69 6f 6e 42 69 74 77 69 73 65 29 3b 0d 0a  ctionBitwise);..
3d90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 75 6e        return fun
3da0: 63 74 69 6f 6e 48 61 6e 64 6c 65 72 73 3b 0d 0a  ctionHandlers;..
3db0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
3dc0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
3dd0: 2f 2f 2f 20 56 61 6c 69 64 20 64 61 74 65 70 61  /// Valid datepa
3de0: 72 74 20 76 61 6c 75 65 73 0d 0a 20 20 20 20 2f  rt values..    /
3df0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
3e00: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
3e10: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
3e20: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 44  private static D
3e30: 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67  ictionary<string
3e40: 2c 20 73 74 72 69 6e 67 3e 20 49 6e 69 74 69 61  , string> Initia
3e50: 6c 69 7a 65 44 61 74 65 70 61 72 74 4b 65 79 77  lizeDatepartKeyw
3e60: 6f 72 64 73 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  ords()..    {.. 
3e70: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 44 61 74       #region Dat
3e80: 65 70 61 72 74 20 4b 65 79 77 6f 72 64 73 0d 0a  epart Keywords..
3e90: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
3ea0: 2f 2f 20 76 61 6c 69 64 20 64 61 74 65 70 61 72  // valid datepar
3eb0: 74 20 76 61 6c 75 65 73 0d 0a 20 20 20 20 20 20  t values..      
3ec0: 2f 2f 0d 0a 20 20 20 20 20 20 44 69 63 74 69 6f  //..      Dictio
3ed0: 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 73 74 72  nary<string, str
3ee0: 69 6e 67 3e 20 64 61 74 65 70 61 72 74 4b 65 79  ing> datepartKey
3ef0: 77 6f 72 64 73 20 3d 20 6e 65 77 20 44 69 63 74  words = new Dict
3f00: 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 73  ionary<string, s
3f10: 74 72 69 6e 67 3e 28 33 30 2c 20 53 74 72 69 6e  tring>(30, Strin
3f20: 67 43 6f 6d 70 61 72 65 72 2e 4f 72 64 69 6e 61  gComparer.Ordina
3f30: 6c 49 67 6e 6f 72 65 43 61 73 65 29 3b 0d 0a 20  lIgnoreCase);.. 
3f40: 20 20 20 20 20 64 61 74 65 70 61 72 74 4b 65 79       datepartKey
3f50: 77 6f 72 64 73 2e 41 64 64 28 22 64 22 2c 20 22  words.Add("d", "
3f60: 25 64 22 29 3b 0d 0a 20 20 20 20 20 20 64 61 74  %d");..      dat
3f70: 65 70 61 72 74 4b 65 79 77 6f 72 64 73 2e 41 64  epartKeywords.Ad
3f80: 64 28 22 64 61 79 22 2c 20 22 25 64 22 29 3b 0d  d("day", "%d");.
3f90: 0a 20 20 20 20 20 20 64 61 74 65 70 61 72 74 4b  .      datepartK
3fa0: 65 79 77 6f 72 64 73 2e 41 64 64 28 22 64 61 79  eywords.Add("day
3fb0: 6f 66 79 65 61 72 22 2c 20 22 25 6a 22 29 3b 0d  ofyear", "%j");.
3fc0: 0a 20 20 20 20 20 20 64 61 74 65 70 61 72 74 4b  .      datepartK
3fd0: 65 79 77 6f 72 64 73 2e 41 64 64 28 22 64 64 22  eywords.Add("dd"
3fe0: 2c 20 22 25 64 22 29 3b 0d 0a 20 20 20 20 20 20  , "%d");..      
3ff0: 64 61 74 65 70 61 72 74 4b 65 79 77 6f 72 64 73  datepartKeywords
4000: 2e 41 64 64 28 22 64 77 22 2c 20 22 25 77 22 29  .Add("dw", "%w")
4010: 3b 0d 0a 20 20 20 20 20 20 64 61 74 65 70 61 72  ;..      datepar
4020: 74 4b 65 79 77 6f 72 64 73 2e 41 64 64 28 22 64  tKeywords.Add("d
4030: 79 22 2c 20 22 25 6a 22 29 3b 0d 0a 20 20 20 20  y", "%j");..    
4040: 20 20 64 61 74 65 70 61 72 74 4b 65 79 77 6f 72    datepartKeywor
4050: 64 73 2e 41 64 64 28 22 68 68 22 2c 20 22 25 48  ds.Add("hh", "%H
4060: 22 29 3b 0d 0a 20 20 20 20 20 20 64 61 74 65 70  ");..      datep
4070: 61 72 74 4b 65 79 77 6f 72 64 73 2e 41 64 64 28  artKeywords.Add(
4080: 22 68 6f 75 72 22 2c 20 22 25 48 22 29 3b 0d 0a  "hour", "%H");..
4090: 20 20 20 20 20 20 64 61 74 65 70 61 72 74 4b 65        datepartKe
40a0: 79 77 6f 72 64 73 2e 41 64 64 28 22 6d 22 2c 20  ywords.Add("m", 
40b0: 22 25 6d 22 29 3b 0d 0a 20 20 20 20 20 20 64 61  "%m");..      da
40c0: 74 65 70 61 72 74 4b 65 79 77 6f 72 64 73 2e 41  tepartKeywords.A
40d0: 64 64 28 22 6d 69 22 2c 20 22 25 4d 22 29 3b 0d  dd("mi", "%M");.
40e0: 0a 20 20 20 20 20 20 64 61 74 65 70 61 72 74 4b  .      datepartK
40f0: 65 79 77 6f 72 64 73 2e 41 64 64 28 22 6d 69 6c  eywords.Add("mil
4100: 6c 69 73 65 63 6f 6e 64 22 2c 20 22 25 66 22 29  lisecond", "%f")
4110: 3b 0d 0a 20 20 20 20 20 20 64 61 74 65 70 61 72  ;..      datepar
4120: 74 4b 65 79 77 6f 72 64 73 2e 41 64 64 28 22 6d  tKeywords.Add("m
4130: 69 6e 75 74 65 22 2c 20 22 25 4d 22 29 3b 0d 0a  inute", "%M");..
4140: 20 20 20 20 20 20 64 61 74 65 70 61 72 74 4b 65        datepartKe
4150: 79 77 6f 72 64 73 2e 41 64 64 28 22 6d 6d 22 2c  ywords.Add("mm",
4160: 20 22 25 6d 22 29 3b 0d 0a 20 20 20 20 20 20 64   "%m");..      d
4170: 61 74 65 70 61 72 74 4b 65 79 77 6f 72 64 73 2e  atepartKeywords.
4180: 41 64 64 28 22 6d 6f 6e 74 68 22 2c 20 22 25 6d  Add("month", "%m
4190: 22 29 3b 0d 0a 20 20 20 20 20 20 64 61 74 65 70  ");..      datep
41a0: 61 72 74 4b 65 79 77 6f 72 64 73 2e 41 64 64 28  artKeywords.Add(
41b0: 22 6d 73 22 2c 20 22 25 66 22 29 3b 0d 0a 20 20  "ms", "%f");..  
41c0: 20 20 20 20 64 61 74 65 70 61 72 74 4b 65 79 77      datepartKeyw
41d0: 6f 72 64 73 2e 41 64 64 28 22 6e 22 2c 20 22 25  ords.Add("n", "%
41e0: 4d 22 29 3b 0d 0a 20 20 20 20 20 20 64 61 74 65  M");..      date
41f0: 70 61 72 74 4b 65 79 77 6f 72 64 73 2e 41 64 64  partKeywords.Add
4200: 28 22 73 22 2c 20 22 25 53 22 29 3b 0d 0a 20 20  ("s", "%S");..  
4210: 20 20 20 20 64 61 74 65 70 61 72 74 4b 65 79 77      datepartKeyw
4220: 6f 72 64 73 2e 41 64 64 28 22 73 65 63 6f 6e 64  ords.Add("second
4230: 22 2c 20 22 25 53 22 29 3b 0d 0a 20 20 20 20 20  ", "%S");..     
4240: 20 64 61 74 65 70 61 72 74 4b 65 79 77 6f 72 64   datepartKeyword
4250: 73 2e 41 64 64 28 22 73 73 22 2c 20 22 25 53 22  s.Add("ss", "%S"
4260: 29 3b 0d 0a 20 20 20 20 20 20 64 61 74 65 70 61  );..      datepa
4270: 72 74 4b 65 79 77 6f 72 64 73 2e 41 64 64 28 22  rtKeywords.Add("
4280: 77 65 65 6b 22 2c 20 22 25 57 22 29 3b 0d 0a 20  week", "%W");.. 
4290: 20 20 20 20 20 64 61 74 65 70 61 72 74 4b 65 79       datepartKey
42a0: 77 6f 72 64 73 2e 41 64 64 28 22 77 65 65 6b 64  words.Add("weekd
42b0: 61 79 22 2c 20 22 25 77 22 29 3b 0d 0a 20 20 20  ay", "%w");..   
42c0: 20 20 20 64 61 74 65 70 61 72 74 4b 65 79 77 6f     datepartKeywo
42d0: 72 64 73 2e 41 64 64 28 22 77 6b 22 2c 20 22 25  rds.Add("wk", "%
42e0: 57 22 29 3b 0d 0a 20 20 20 20 20 20 64 61 74 65  W");..      date
42f0: 70 61 72 74 4b 65 79 77 6f 72 64 73 2e 41 64 64  partKeywords.Add
4300: 28 22 77 77 22 2c 20 22 25 57 22 29 3b 0d 0a 20  ("ww", "%W");.. 
4310: 20 20 20 20 20 64 61 74 65 70 61 72 74 4b 65 79       datepartKey
4320: 77 6f 72 64 73 2e 41 64 64 28 22 79 22 2c 20 22  words.Add("y", "
4330: 25 59 22 29 3b 0d 0a 20 20 20 20 20 20 64 61 74  %Y");..      dat
4340: 65 70 61 72 74 4b 65 79 77 6f 72 64 73 2e 41 64  epartKeywords.Ad
4350: 64 28 22 79 65 61 72 22 2c 20 22 25 59 22 29 3b  d("year", "%Y");
4360: 0d 0a 20 20 20 20 20 20 64 61 74 65 70 61 72 74  ..      datepart
4370: 4b 65 79 77 6f 72 64 73 2e 41 64 64 28 22 79 79  Keywords.Add("yy
4380: 22 2c 20 22 25 59 22 29 3b 0d 0a 20 20 20 20 20  ", "%Y");..     
4390: 20 64 61 74 65 70 61 72 74 4b 65 79 77 6f 72 64   datepartKeyword
43a0: 73 2e 41 64 64 28 22 79 79 79 79 22 2c 20 22 25  s.Add("yyyy", "%
43b0: 59 22 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75  Y");..      retu
43c0: 72 6e 20 64 61 74 65 70 61 72 74 4b 65 79 77 6f  rn datepartKeywo
43d0: 72 64 73 3b 0d 0a 20 20 20 20 20 20 23 65 6e 64  rds;..      #end
43e0: 72 65 67 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0d  region..    }...
43f0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
4400: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 49 6e 69 74  y>..    /// Init
4410: 69 61 6c 69 7a 65 73 20 74 68 65 20 6d 61 70 70  ializes the mapp
4420: 69 6e 67 20 66 72 6f 6d 20 66 75 6e 63 74 69 6f  ing from functio
4430: 6e 73 20 74 6f 20 54 2d 53 51 4c 20 6f 70 65 72  ns to T-SQL oper
4440: 61 74 6f 72 73 0d 0a 20 20 20 20 2f 2f 2f 20 66  ators..    /// f
4450: 6f 72 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73  or all functions
4460: 20 74 68 61 74 20 74 72 61 6e 73 6c 61 74 65 20   that translate 
4470: 74 6f 20 54 2d 53 51 4c 20 6f 70 65 72 61 74 6f  to T-SQL operato
4480: 72 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  rs..    /// </su
4490: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
44a0: 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72  <returns></retur
44b0: 6e 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65  ns>..    private
44c0: 20 73 74 61 74 69 63 20 44 69 63 74 69 6f 6e 61   static Dictiona
44d0: 72 79 3c 73 74 72 69 6e 67 2c 20 73 74 72 69 6e  ry<string, strin
44e0: 67 3e 20 49 6e 69 74 69 61 6c 69 7a 65 46 75 6e  g> InitializeFun
44f0: 63 74 69 6f 6e 4e 61 6d 65 54 6f 4f 70 65 72 61  ctionNameToOpera
4500: 74 6f 72 44 69 63 74 69 6f 6e 61 72 79 28 29 0d  torDictionary().
4510: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 44 69  .    {..      Di
4520: 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c  ctionary<string,
4530: 20 73 74 72 69 6e 67 3e 20 66 75 6e 63 74 69 6f   string> functio
4540: 6e 4e 61 6d 65 54 6f 4f 70 65 72 61 74 6f 72 44  nNameToOperatorD
4550: 69 63 74 69 6f 6e 61 72 79 20 3d 20 6e 65 77 20  ictionary = new 
4560: 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e  Dictionary<strin
4570: 67 2c 20 73 74 72 69 6e 67 3e 28 35 2c 20 53 74  g, string>(5, St
4580: 72 69 6e 67 43 6f 6d 70 61 72 65 72 2e 4f 72 64  ringComparer.Ord
4590: 69 6e 61 6c 29 3b 0d 0a 20 20 20 20 20 20 66 75  inal);..      fu
45a0: 6e 63 74 69 6f 6e 4e 61 6d 65 54 6f 4f 70 65 72  nctionNameToOper
45b0: 61 74 6f 72 44 69 63 74 69 6f 6e 61 72 79 2e 41  atorDictionary.A
45c0: 64 64 28 22 43 6f 6e 63 61 74 22 2c 20 22 7c 7c  dd("Concat", "||
45d0: 22 29 3b 20 20 20 20 2f 2f 63 61 6e 6f 6e 69 63  ");    //canonic
45e0: 61 6c 0d 0a 20 20 20 20 20 20 66 75 6e 63 74 69  al..      functi
45f0: 6f 6e 4e 61 6d 65 54 6f 4f 70 65 72 61 74 6f 72  onNameToOperator
4600: 44 69 63 74 69 6f 6e 61 72 79 2e 41 64 64 28 22  Dictionary.Add("
4610: 43 4f 4e 43 41 54 22 2c 20 22 7c 7c 22 29 3b 20  CONCAT", "||"); 
4620: 20 20 20 2f 2f 73 74 6f 72 65 0d 0a 20 20 20 20     //store..    
4630: 20 20 66 75 6e 63 74 69 6f 6e 4e 61 6d 65 54 6f    functionNameTo
4640: 4f 70 65 72 61 74 6f 72 44 69 63 74 69 6f 6e 61  OperatorDictiona
4650: 72 79 2e 41 64 64 28 22 42 69 74 77 69 73 65 41  ry.Add("BitwiseA
4660: 6e 64 22 2c 20 22 26 22 29 3b 0d 0a 20 20 20 20  nd", "&");..    
4670: 20 20 66 75 6e 63 74 69 6f 6e 4e 61 6d 65 54 6f    functionNameTo
4680: 4f 70 65 72 61 74 6f 72 44 69 63 74 69 6f 6e 61  OperatorDictiona
4690: 72 79 2e 41 64 64 28 22 42 69 74 77 69 73 65 4e  ry.Add("BitwiseN
46a0: 6f 74 22 2c 20 22 7e 22 29 3b 0d 0a 20 20 20 20  ot", "~");..    
46b0: 20 20 66 75 6e 63 74 69 6f 6e 4e 61 6d 65 54 6f    functionNameTo
46c0: 4f 70 65 72 61 74 6f 72 44 69 63 74 69 6f 6e 61  OperatorDictiona
46d0: 72 79 2e 41 64 64 28 22 42 69 74 77 69 73 65 4f  ry.Add("BitwiseO
46e0: 72 22 2c 20 22 7c 22 29 3b 0d 0a 20 20 20 20 20  r", "|");..     
46f0: 20 66 75 6e 63 74 69 6f 6e 4e 61 6d 65 54 6f 4f   functionNameToO
4700: 70 65 72 61 74 6f 72 44 69 63 74 69 6f 6e 61 72  peratorDictionar
4710: 79 2e 41 64 64 28 22 42 69 74 77 69 73 65 58 6f  y.Add("BitwiseXo
4720: 72 22 2c 20 22 5e 22 29 3b 0d 0a 20 20 20 20 20  r", "^");..     
4730: 20 72 65 74 75 72 6e 20 66 75 6e 63 74 69 6f 6e   return function
4740: 4e 61 6d 65 54 6f 4f 70 65 72 61 74 6f 72 44 69  NameToOperatorDi
4750: 63 74 69 6f 6e 61 72 79 3b 0d 0a 20 20 20 20 7d  ctionary;..    }
4760: 0d 0a 0d 0a 20 20 20 20 23 65 6e 64 72 65 67 69  ....    #endregi
4770: 6f 6e 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f  on....    #regio
4780: 6e 20 43 6f 6e 73 74 72 75 63 74 6f 72 0d 0a 20  n Constructor.. 
4790: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
47a0: 0d 0a 20 20 20 20 2f 2f 2f 20 42 61 73 69 63 20  ..    /// Basic 
47b0: 63 6f 6e 73 74 72 75 63 74 6f 72 2e 0d 0a 20 20  constructor...  
47c0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
47d0: 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 53 71  ..    private Sq
47e0: 6c 47 65 6e 65 72 61 74 6f 72 28 53 51 4c 69 74  lGenerator(SQLit
47f0: 65 50 72 6f 76 69 64 65 72 4d 61 6e 69 66 65 73  eProviderManifes
4800: 74 20 6d 61 6e 69 66 65 73 74 29 0d 0a 20 20 20  t manifest)..   
4810: 20 7b 0d 0a 20 20 20 20 20 20 5f 6d 61 6e 69 66   {..      _manif
4820: 65 73 74 20 3d 20 6d 61 6e 69 66 65 73 74 3b 0d  est = manifest;.
4830: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64  .    }..    #end
4840: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 23 72  region....    #r
4850: 65 67 69 6f 6e 20 45 6e 74 72 79 20 70 6f 69 6e  egion Entry poin
4860: 74 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ts..    /// <sum
4870: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 47  mary>..    /// G
4880: 65 6e 65 72 61 6c 20 70 75 72 70 6f 73 65 20 73  eneral purpose s
4890: 74 61 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 74  tatic function t
48a0: 68 61 74 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  hat can be calle
48b0: 64 20 66 72 6f 6d 20 53 79 73 74 65 6d 2e 44 61  d from System.Da
48c0: 74 61 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  ta assembly..   
48d0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
48e0: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
48f0: 6e 61 6d 65 3d 22 6d 61 6e 69 66 65 73 74 22 3e  name="manifest">
4900: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
4910: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 74  / <param name="t
4920: 72 65 65 22 3e 63 6f 6d 6d 61 6e 64 20 74 72 65  ree">command tre
4930: 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  e</param>..    /
4940: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
4950: 70 61 72 61 6d 65 74 65 72 73 22 3e 50 61 72 61  parameters">Para
4960: 6d 65 74 65 72 73 20 74 6f 20 61 64 64 20 74 6f  meters to add to
4970: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 72 65   the command tre
4980: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0d  e corresponding.
4990: 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 63 6f 6e 73  .    /// to cons
49a0: 74 61 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  tants in the com
49b0: 6d 61 6e 64 20 74 72 65 65 2e 20 55 73 65 64 20  mand tree. Used 
49c0: 6f 6e 6c 79 20 69 6e 20 4d 6f 64 69 66 69 63 61  only in Modifica
49d0: 74 69 6f 6e 43 6f 6d 6d 61 6e 64 54 72 65 65 73  tionCommandTrees
49e0: 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  .</param>..    /
49f0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
4a00: 63 6f 6d 6d 61 6e 64 54 79 70 65 22 3e 3c 2f 70  commandType"></p
4a10: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
4a20: 72 65 74 75 72 6e 73 3e 54 68 65 20 73 74 72 69  returns>The stri
4a30: 6e 67 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ng representing 
4a40: 74 68 65 20 53 51 4c 20 74 6f 20 62 65 20 65 78  the SQL to be ex
4a50: 65 63 75 74 65 64 2e 3c 2f 72 65 74 75 72 6e 73  ecuted.</returns
4a60: 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  >..    internal 
4a70: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 47 65  static string Ge
4a80: 6e 65 72 61 74 65 53 71 6c 28 53 51 4c 69 74 65  nerateSql(SQLite
4a90: 50 72 6f 76 69 64 65 72 4d 61 6e 69 66 65 73 74  ProviderManifest
4aa0: 20 6d 61 6e 69 66 65 73 74 2c 20 44 62 43 6f 6d   manifest, DbCom
4ab0: 6d 61 6e 64 54 72 65 65 20 74 72 65 65 2c 20 6f  mandTree tree, o
4ac0: 75 74 20 4c 69 73 74 3c 44 62 50 61 72 61 6d 65  ut List<DbParame
4ad0: 74 65 72 3e 20 70 61 72 61 6d 65 74 65 72 73 2c  ter> parameters,
4ae0: 20 6f 75 74 20 43 6f 6d 6d 61 6e 64 54 79 70 65   out CommandType
4af0: 20 63 6f 6d 6d 61 6e 64 54 79 70 65 29 0d 0a 20   commandType).. 
4b00: 20 20 20 7b 0d 0a 20 20 20 20 20 20 63 6f 6d 6d     {..      comm
4b10: 61 6e 64 54 79 70 65 20 3d 20 43 6f 6d 6d 61 6e  andType = Comman
4b20: 64 54 79 70 65 2e 54 65 78 74 3b 0d 0a 0d 0a 20  dType.Text;.... 
4b30: 20 20 20 20 20 2f 2f 48 61 6e 64 6c 65 20 51 75       //Handle Qu
4b40: 65 72 79 0d 0a 20 20 20 20 20 20 44 62 51 75 65  ery..      DbQue
4b50: 72 79 43 6f 6d 6d 61 6e 64 54 72 65 65 20 71 75  ryCommandTree qu
4b60: 65 72 79 43 6f 6d 6d 61 6e 64 54 72 65 65 20 3d  eryCommandTree =
4b70: 20 74 72 65 65 20 61 73 20 44 62 51 75 65 72 79   tree as DbQuery
4b80: 43 6f 6d 6d 61 6e 64 54 72 65 65 3b 0d 0a 20 20  CommandTree;..  
4b90: 20 20 20 20 69 66 20 28 71 75 65 72 79 43 6f 6d      if (queryCom
4ba0: 6d 61 6e 64 54 72 65 65 20 21 3d 20 6e 75 6c 6c  mandTree != null
4bb0: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
4bc0: 20 20 20 20 53 71 6c 47 65 6e 65 72 61 74 6f 72      SqlGenerator
4bd0: 20 73 71 6c 47 65 6e 20 3d 20 6e 65 77 20 53 71   sqlGen = new Sq
4be0: 6c 47 65 6e 65 72 61 74 6f 72 28 6d 61 6e 69 66  lGenerator(manif
4bf0: 65 73 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 70  est);..        p
4c00: 61 72 61 6d 65 74 65 72 73 20 3d 20 6e 75 6c 6c  arameters = null
4c10: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 74 72  ;....        str
4c20: 69 6e 67 20 73 71 6c 20 3d 20 73 71 6c 47 65 6e  ing sql = sqlGen
4c30: 2e 47 65 6e 65 72 61 74 65 53 71 6c 28 28 44 62  .GenerateSql((Db
4c40: 51 75 65 72 79 43 6f 6d 6d 61 6e 64 54 72 65 65  QueryCommandTree
4c50: 29 74 72 65 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  )tree);....     
4c60: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 3b 0d 0a     return sql;..
4c70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4c80: 20 2f 2f 48 61 6e 64 6c 65 20 46 75 6e 63 74 69   //Handle Functi
4c90: 6f 6e 0d 0a 20 20 20 20 20 20 44 62 46 75 6e 63  on..      DbFunc
4ca0: 74 69 6f 6e 43 6f 6d 6d 61 6e 64 54 72 65 65 20  tionCommandTree 
4cb0: 44 62 46 75 6e 63 74 69 6f 6e 43 6f 6d 6d 61 6e  DbFunctionComman
4cc0: 64 54 72 65 65 20 3d 20 74 72 65 65 20 61 73 20  dTree = tree as 
4cd0: 44 62 46 75 6e 63 74 69 6f 6e 43 6f 6d 6d 61 6e  DbFunctionComman
4ce0: 64 54 72 65 65 3b 0d 0a 20 20 20 20 20 20 69 66  dTree;..      if
4cf0: 20 28 44 62 46 75 6e 63 74 69 6f 6e 43 6f 6d 6d   (DbFunctionComm
4d00: 61 6e 64 54 72 65 65 20 21 3d 20 6e 75 6c 6c 29  andTree != null)
4d10: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
4d20: 20 20 20 53 71 6c 47 65 6e 65 72 61 74 6f 72 20     SqlGenerator 
4d30: 73 71 6c 47 65 6e 20 3d 20 6e 65 77 20 53 71 6c  sqlGen = new Sql
4d40: 47 65 6e 65 72 61 74 6f 72 28 6d 61 6e 69 66 65  Generator(manife
4d50: 73 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 70 61  st);..        pa
4d60: 72 61 6d 65 74 65 72 73 20 3d 20 6e 75 6c 6c 3b  rameters = null;
4d70: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69  ....        stri
4d80: 6e 67 20 73 71 6c 20 3d 20 73 71 6c 47 65 6e 2e  ng sql = sqlGen.
4d90: 47 65 6e 65 72 61 74 65 46 75 6e 63 74 69 6f 6e  GenerateFunction
4da0: 53 71 6c 28 44 62 46 75 6e 63 74 69 6f 6e 43 6f  Sql(DbFunctionCo
4db0: 6d 6d 61 6e 64 54 72 65 65 2c 20 6f 75 74 20 63  mmandTree, out c
4dc0: 6f 6d 6d 61 6e 64 54 79 70 65 29 3b 0d 0a 0d 0a  ommandType);....
4dd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
4de0: 71 6c 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ql;..      }....
4df0: 20 20 20 20 20 20 2f 2f 48 61 6e 64 6c 65 20 49        //Handle I
4e00: 6e 73 65 72 74 0d 0a 20 20 20 20 20 20 44 62 49  nsert..      DbI
4e10: 6e 73 65 72 74 43 6f 6d 6d 61 6e 64 54 72 65 65  nsertCommandTree
4e20: 20 69 6e 73 65 72 74 43 6f 6d 6d 61 6e 64 54 72   insertCommandTr
4e30: 65 65 20 3d 20 74 72 65 65 20 61 73 20 44 62 49  ee = tree as DbI
4e40: 6e 73 65 72 74 43 6f 6d 6d 61 6e 64 54 72 65 65  nsertCommandTree
4e50: 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 69 6e 73  ;..      if (ins
4e60: 65 72 74 43 6f 6d 6d 61 6e 64 54 72 65 65 20 21  ertCommandTree !
4e70: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 7b  = null)..      {
4e80: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4e90: 20 44 6d 6c 53 71 6c 47 65 6e 65 72 61 74 6f 72   DmlSqlGenerator
4ea0: 2e 47 65 6e 65 72 61 74 65 49 6e 73 65 72 74 53  .GenerateInsertS
4eb0: 71 6c 28 69 6e 73 65 72 74 43 6f 6d 6d 61 6e 64  ql(insertCommand
4ec0: 54 72 65 65 2c 20 6f 75 74 20 70 61 72 61 6d 65  Tree, out parame
4ed0: 74 65 72 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ters);..      }.
4ee0: 0a 0d 0a 20 20 20 20 20 20 2f 2f 48 61 6e 64 6c  ...      //Handl
4ef0: 65 20 44 65 6c 65 74 65 0d 0a 20 20 20 20 20 20  e Delete..      
4f00: 44 62 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 54  DbDeleteCommandT
4f10: 72 65 65 20 64 65 6c 65 74 65 43 6f 6d 6d 61 6e  ree deleteComman
4f20: 64 54 72 65 65 20 3d 20 74 72 65 65 20 61 73 20  dTree = tree as 
4f30: 44 62 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 54  DbDeleteCommandT
4f40: 72 65 65 3b 0d 0a 20 20 20 20 20 20 69 66 20 28  ree;..      if (
4f50: 64 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 54 72 65  deleteCommandTre
4f60: 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e != null)..    
4f70: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74    {..        ret
4f80: 75 72 6e 20 44 6d 6c 53 71 6c 47 65 6e 65 72 61  urn DmlSqlGenera
4f90: 74 6f 72 2e 47 65 6e 65 72 61 74 65 44 65 6c 65  tor.GenerateDele
4fa0: 74 65 53 71 6c 28 64 65 6c 65 74 65 43 6f 6d 6d  teSql(deleteComm
4fb0: 61 6e 64 54 72 65 65 2c 20 6f 75 74 20 70 61 72  andTree, out par
4fc0: 61 6d 65 74 65 72 73 29 3b 0d 0a 20 20 20 20 20  ameters);..     
4fd0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 48 61   }....      //Ha
4fe0: 6e 64 6c 65 20 55 70 64 61 74 65 0d 0a 20 20 20  ndle Update..   
4ff0: 20 20 20 44 62 55 70 64 61 74 65 43 6f 6d 6d 61     DbUpdateComma
5000: 6e 64 54 72 65 65 20 75 70 64 61 74 65 43 6f 6d  ndTree updateCom
5010: 6d 61 6e 64 54 72 65 65 20 3d 20 74 72 65 65 20  mandTree = tree 
5020: 61 73 20 44 62 55 70 64 61 74 65 43 6f 6d 6d 61  as DbUpdateComma
5030: 6e 64 54 72 65 65 3b 0d 0a 20 20 20 20 20 20 69  ndTree;..      i
5040: 66 20 28 75 70 64 61 74 65 43 6f 6d 6d 61 6e 64  f (updateCommand
5050: 54 72 65 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  Tree != null).. 
5060: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5070: 72 65 74 75 72 6e 20 44 6d 6c 53 71 6c 47 65 6e  return DmlSqlGen
5080: 65 72 61 74 6f 72 2e 47 65 6e 65 72 61 74 65 55  erator.GenerateU
5090: 70 64 61 74 65 53 71 6c 28 75 70 64 61 74 65 43  pdateSql(updateC
50a0: 6f 6d 6d 61 6e 64 54 72 65 65 2c 20 6f 75 74 20  ommandTree, out 
50b0: 70 61 72 61 6d 65 74 65 72 73 29 3b 0d 0a 20 20  parameters);..  
50c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74      }....      t
50d0: 68 72 6f 77 20 6e 65 77 20 4e 6f 74 53 75 70 70  hrow new NotSupp
50e0: 6f 72 74 65 64 45 78 63 65 70 74 69 6f 6e 28 22  ortedException("
50f0: 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 63 6f 6d  Unrecognized com
5100: 6d 61 6e 64 20 74 72 65 65 20 74 79 70 65 22 29  mand tree type")
5110: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65  ;..    }..    #e
5120: 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
5130: 2f 2f 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20  //StringBuilder 
5140: 5f 74 79 70 65 44 65 66 73 20 3d 20 6e 65 77 20  _typeDefs = new 
5150: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b  StringBuilder();
5160: 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f 6e 20  ....    #region 
5170: 44 72 69 76 65 72 20 4d 65 74 68 6f 64 73 0d 0a  Driver Methods..
5180: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
5190: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 72 61 6e 73  >..    /// Trans
51a0: 6c 61 74 65 20 61 20 63 6f 6d 6d 61 6e 64 20 74  late a command t
51b0: 72 65 65 20 74 6f 20 61 20 53 51 4c 20 73 74 72  ree to a SQL str
51c0: 69 6e 67 2e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20  ing...    ///.. 
51d0: 20 20 20 2f 2f 2f 20 54 68 65 20 69 6e 70 75 74     /// The input
51e0: 20 74 72 65 65 20 63 6f 75 6c 64 20 62 65 20 74   tree could be t
51f0: 72 61 6e 73 6c 61 74 65 64 20 74 6f 20 65 69 74  ranslated to eit
5200: 68 65 72 20 61 20 53 51 4c 20 53 45 4c 45 43 54  her a SQL SELECT
5210: 20 73 74 61 74 65 6d 65 6e 74 0d 0a 20 20 20 20   statement..    
5220: 2f 2f 2f 20 6f 72 20 61 20 53 45 4c 45 43 54 20  /// or a SELECT 
5230: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 69  expression.  Thi
5240: 73 20 63 68 6f 69 63 65 20 69 73 20 6d 61 64 65  s choice is made
5250: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
5260: 74 75 72 6e 20 74 79 70 65 0d 0a 20 20 20 20 2f  turn type..    /
5270: 2f 2f 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  // of the expres
5280: 73 69 6f 6e 0d 0a 20 20 20 20 2f 2f 2f 20 43 6f  sion..    /// Co
5290: 6c 6c 65 63 74 69 6f 6e 54 79 70 65 20 3d 3e 20  llectionType => 
52a0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
52b0: 0d 0a 20 20 20 20 2f 2f 2f 20 6e 6f 6e 20 63 6f  ..    /// non co
52c0: 6c 6c 65 63 74 69 6f 6e 20 74 79 70 65 20 3d 3e  llection type =>
52d0: 20 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69   select expressi
52e0: 6f 6e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  on..    /// </su
52f0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
5300: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 74 72 65  <param name="tre
5310: 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  e"></param>..   
5320: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 54 68   /// <returns>Th
5330: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
5340: 6e 74 69 6e 67 20 74 68 65 20 53 51 4c 20 74 6f  nting the SQL to
5350: 20 62 65 20 65 78 65 63 75 74 65 64 2e 3c 2f 72   be executed.</r
5360: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 72 69  eturns>..    pri
5370: 76 61 74 65 20 73 74 72 69 6e 67 20 47 65 6e 65  vate string Gene
5380: 72 61 74 65 53 71 6c 28 44 62 51 75 65 72 79 43  rateSql(DbQueryC
5390: 6f 6d 6d 61 6e 64 54 72 65 65 20 74 72 65 65 29  ommandTree tree)
53a0: 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20 66 61 6c  ..    {..#if fal
53b0: 73 65 0d 0a 20 20 20 20 20 20 74 72 65 65 20 3d  se..      tree =
53c0: 20 53 71 6c 43 68 65 63 6b 65 72 2e 52 65 77 72   SqlChecker.Rewr
53d0: 69 74 65 28 74 72 65 65 29 3b 0d 0a 23 65 6e 64  ite(tree);..#end
53e0: 69 66 0d 0a 0d 0a 20 20 20 20 20 20 73 65 6c 65  if....      sele
53f0: 63 74 53 74 61 74 65 6d 65 6e 74 53 74 61 63 6b  ctStatementStack
5400: 20 3d 20 6e 65 77 20 53 74 61 63 6b 3c 53 71 6c   = new Stack<Sql
5410: 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 3e  SelectStatement>
5420: 28 29 3b 0d 0a 20 20 20 20 20 20 69 73 50 61 72  ();..      isPar
5430: 65 6e 74 41 4a 6f 69 6e 53 74 61 63 6b 20 3d 20  entAJoinStack = 
5440: 6e 65 77 20 53 74 61 63 6b 3c 62 6f 6f 6c 3e 28  new Stack<bool>(
5450: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 61 6c 6c 45  );....      allE
5460: 78 74 65 6e 74 4e 61 6d 65 73 20 3d 20 6e 65 77  xtentNames = new
5470: 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69   Dictionary<stri
5480: 6e 67 2c 20 69 6e 74 3e 28 53 74 72 69 6e 67 43  ng, int>(StringC
5490: 6f 6d 70 61 72 65 72 2e 4f 72 64 69 6e 61 6c 49  omparer.OrdinalI
54a0: 67 6e 6f 72 65 43 61 73 65 29 3b 0d 0a 20 20 20  gnoreCase);..   
54b0: 20 20 20 61 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65     allColumnName
54c0: 73 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e 61  s = new Dictiona
54d0: 72 79 3c 73 74 72 69 6e 67 2c 20 69 6e 74 3e 28  ry<string, int>(
54e0: 53 74 72 69 6e 67 43 6f 6d 70 61 72 65 72 2e 4f  StringComparer.O
54f0: 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65  rdinalIgnoreCase
5500: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 4c  );....      // L
5510: 69 74 65 72 61 6c 73 20 77 69 6c 6c 20 6e 6f 74  iterals will not
5520: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   be converted to
5530: 20 70 61 72 61 6d 65 74 65 72 73 2e 0d 0a 0d 0a   parameters.....
5540: 20 20 20 20 20 20 49 53 71 6c 46 72 61 67 6d 65        ISqlFragme
5550: 6e 74 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20  nt result;..    
5560: 20 20 69 66 20 28 4d 65 74 61 64 61 74 61 48 65    if (MetadataHe
5570: 6c 70 65 72 73 2e 49 73 43 6f 6c 6c 65 63 74 69  lpers.IsCollecti
5580: 6f 6e 54 79 70 65 28 74 72 65 65 2e 51 75 65 72  onType(tree.Quer
5590: 79 2e 52 65 73 75 6c 74 54 79 70 65 29 29 0d 0a  y.ResultType))..
55a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
55b0: 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d   SqlSelectStatem
55c0: 65 6e 74 20 73 71 6c 53 74 61 74 65 6d 65 6e 74  ent sqlStatement
55d0: 20 3d 20 56 69 73 69 74 45 78 70 72 65 73 73 69   = VisitExpressi
55e0: 6f 6e 45 6e 73 75 72 65 53 71 6c 53 74 61 74 65  onEnsureSqlState
55f0: 6d 65 6e 74 28 74 72 65 65 2e 51 75 65 72 79 29  ment(tree.Query)
5600: 3b 0d 0a 20 20 20 20 20 20 20 20 44 65 62 75 67  ;..        Debug
5610: 2e 41 73 73 65 72 74 28 73 71 6c 53 74 61 74 65  .Assert(sqlState
5620: 6d 65 6e 74 20 21 3d 20 6e 75 6c 6c 2c 20 22 54  ment != null, "T
5630: 68 65 20 6f 75 74 65 72 20 6d 6f 73 74 20 73 71  he outer most sq
5640: 6c 20 73 74 61 74 6d 65 6e 74 20 69 73 20 6e 75  l statment is nu
5650: 6c 6c 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 73  ll");..        s
5660: 71 6c 53 74 61 74 65 6d 65 6e 74 2e 49 73 54 6f  qlStatement.IsTo
5670: 70 4d 6f 73 74 20 3d 20 74 72 75 65 3b 0d 0a 20  pMost = true;.. 
5680: 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20         result = 
5690: 73 71 6c 53 74 61 74 65 6d 65 6e 74 3b 0d 0a 0d  sqlStatement;...
56a0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
56b0: 65 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  else..      {.. 
56c0: 20 20 20 20 20 20 20 53 71 6c 42 75 69 6c 64 65         SqlBuilde
56d0: 72 20 73 71 6c 42 75 69 6c 64 65 72 20 3d 20 6e  r sqlBuilder = n
56e0: 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28 29 3b  ew SqlBuilder();
56f0: 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 42 75 69  ..        sqlBui
5700: 6c 64 65 72 2e 41 70 70 65 6e 64 28 22 53 45 4c  lder.Append("SEL
5710: 45 43 54 20 22 29 3b 0d 0a 20 20 20 20 20 20 20  ECT ");..       
5720: 20 73 71 6c 42 75 69 6c 64 65 72 2e 41 70 70 65   sqlBuilder.Appe
5730: 6e 64 28 74 72 65 65 2e 51 75 65 72 79 2e 41 63  nd(tree.Query.Ac
5740: 63 65 70 74 28 74 68 69 73 29 29 3b 0d 0a 0d 0a  cept(this));....
5750: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
5760: 20 73 71 6c 42 75 69 6c 64 65 72 3b 0d 0a 20 20   sqlBuilder;..  
5770: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
5780: 66 20 28 69 73 56 61 72 52 65 66 53 69 6e 67 6c  f (isVarRefSingl
5790: 65 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  e)..      {..   
57a0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e       throw new N
57b0: 6f 74 53 75 70 70 6f 72 74 65 64 45 78 63 65 70  otSupportedExcep
57c0: 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20  tion();..       
57d0: 20 2f 2f 20 41 20 44 62 56 61 72 69 61 62 6c 65   // A DbVariable
57e0: 52 65 66 65 72 65 6e 63 65 45 78 70 72 65 73 73  ReferenceExpress
57f0: 69 6f 6e 20 68 61 73 20 74 6f 20 62 65 20 61 20  ion has to be a 
5800: 63 68 69 6c 64 20 6f 66 20 44 62 50 72 6f 70 65  child of DbPrope
5810: 72 74 79 45 78 70 72 65 73 73 69 6f 6e 20 6f 72  rtyExpression or
5820: 20 4d 65 74 68 6f 64 45 78 70 72 65 73 73 69 6f   MethodExpressio
5830: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
5840: 20 20 20 20 2f 2f 20 43 68 65 63 6b 20 74 68 61      // Check tha
5850: 74 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  t the parameter 
5860: 73 74 61 63 6b 73 20 61 72 65 20 6e 6f 74 20 6c  stacks are not l
5870: 65 61 6b 69 6e 67 2e 0d 0a 20 20 20 20 20 20 44  eaking...      D
5880: 65 62 75 67 2e 41 73 73 65 72 74 28 73 65 6c 65  ebug.Assert(sele
5890: 63 74 53 74 61 74 65 6d 65 6e 74 53 74 61 63 6b  ctStatementStack
58a0: 2e 43 6f 75 6e 74 20 3d 3d 20 30 29 3b 0d 0a 20  .Count == 0);.. 
58b0: 20 20 20 20 20 44 65 62 75 67 2e 41 73 73 65 72       Debug.Asser
58c0: 74 28 69 73 50 61 72 65 6e 74 41 4a 6f 69 6e 53  t(isParentAJoinS
58d0: 74 61 63 6b 2e 43 6f 75 6e 74 20 3d 3d 20 30 29  tack.Count == 0)
58e0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 69 66 20  ;....      //if 
58f0: 28 5f 74 79 70 65 44 65 66 73 2e 4c 65 6e 67 74  (_typeDefs.Lengt
5900: 68 20 3e 20 30 29 0d 0a 20 20 20 20 20 20 2f 2f  h > 0)..      //
5910: 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 20 5f 74 79  {..      //  _ty
5920: 70 65 44 65 66 73 2e 49 6e 73 65 72 74 28 30 78  peDefs.Insert(0x
5930: 30 2c 20 22 54 59 50 45 53 20 22 29 3b 0d 0a 20  0, "TYPES ");.. 
5940: 20 20 20 20 20 2f 2f 20 20 5f 74 79 70 65 44 65       //  _typeDe
5950: 66 73 2e 41 70 70 65 6e 64 28 22 3b 5c 72 5c 6e  fs.Append(";\r\n
5960: 22 29 3b 0d 0a 20 20 20 20 20 20 2f 2f 20 20 5f  ");..      //  _
5970: 74 79 70 65 44 65 66 73 2e 41 70 70 65 6e 64 28  typeDefs.Append(
5980: 57 72 69 74 65 53 71 6c 28 72 65 73 75 6c 74 29  WriteSql(result)
5990: 29 3b 0d 0a 20 20 20 20 20 20 2f 2f 20 20 72 65  );..      //  re
59a0: 74 75 72 6e 20 5f 74 79 70 65 44 65 66 73 2e 54  turn _typeDefs.T
59b0: 6f 53 74 72 69 6e 67 28 29 3b 0d 0a 20 20 20 20  oString();..    
59c0: 20 20 2f 2f 7d 0d 0a 0d 0a 20 20 20 20 20 20 72    //}....      r
59d0: 65 74 75 72 6e 20 57 72 69 74 65 53 71 6c 28 72  eturn WriteSql(r
59e0: 65 73 75 6c 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a  esult);..    }..
59f0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
5a00: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 72 61  ry>..    /// Tra
5a10: 6e 73 6c 61 74 65 20 61 20 66 75 6e 63 74 69 6f  nslate a functio
5a20: 6e 20 63 6f 6d 6d 61 6e 64 20 74 72 65 65 20 74  n command tree t
5a30: 6f 20 61 20 53 51 4c 20 73 74 72 69 6e 67 2e 0d  o a SQL string..
5a40: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
5a50: 72 79 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65  ry>..    private
5a60: 20 73 74 72 69 6e 67 20 47 65 6e 65 72 61 74 65   string Generate
5a70: 46 75 6e 63 74 69 6f 6e 53 71 6c 28 44 62 46 75  FunctionSql(DbFu
5a80: 6e 63 74 69 6f 6e 43 6f 6d 6d 61 6e 64 54 72 65  nctionCommandTre
5a90: 65 20 74 72 65 65 2c 20 6f 75 74 20 43 6f 6d 6d  e tree, out Comm
5aa0: 61 6e 64 54 79 70 65 20 63 6f 6d 6d 61 6e 64 54  andType commandT
5ab0: 79 70 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ype)..    {..   
5ac0: 20 20 20 45 64 6d 46 75 6e 63 74 69 6f 6e 20 66     EdmFunction f
5ad0: 75 6e 63 74 69 6f 6e 20 3d 20 74 72 65 65 2e 45  unction = tree.E
5ae0: 64 6d 46 75 6e 63 74 69 6f 6e 3b 0d 0a 0d 0a 20  dmFunction;.... 
5af0: 20 20 20 20 20 2f 2f 20 57 65 20 65 78 70 65 63       // We expec
5b00: 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 6c  t function to al
5b10: 77 61 79 73 20 68 61 76 65 20 74 68 65 73 65 20  ways have these 
5b20: 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20  properties..    
5b30: 20 20 73 74 72 69 6e 67 20 75 73 65 72 43 6f 6d    string userCom
5b40: 6d 61 6e 64 54 65 78 74 20 3d 20 28 73 74 72 69  mandText = (stri
5b50: 6e 67 29 66 75 6e 63 74 69 6f 6e 2e 4d 65 74 61  ng)function.Meta
5b60: 64 61 74 61 50 72 6f 70 65 72 74 69 65 73 5b 22  dataProperties["
5b70: 43 6f 6d 6d 61 6e 64 54 65 78 74 41 74 74 72 69  CommandTextAttri
5b80: 62 75 74 65 22 5d 2e 56 61 6c 75 65 3b 0d 0a 20  bute"].Value;.. 
5b90: 20 20 20 20 20 2f 2f 73 74 72 69 6e 67 20 75 73       //string us
5ba0: 65 72 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 28  erSchemaName = (
5bb0: 73 74 72 69 6e 67 29 66 75 6e 63 74 69 6f 6e 2e  string)function.
5bc0: 4d 65 74 61 64 61 74 61 50 72 6f 70 65 72 74 69  MetadataProperti
5bd0: 65 73 5b 22 53 63 68 65 6d 61 22 5d 2e 56 61 6c  es["Schema"].Val
5be0: 75 65 3b 0d 0a 20 20 20 20 20 20 73 74 72 69 6e  ue;..      strin
5bf0: 67 20 75 73 65 72 46 75 6e 63 4e 61 6d 65 20 3d  g userFuncName =
5c00: 20 28 73 74 72 69 6e 67 29 66 75 6e 63 74 69 6f   (string)functio
5c10: 6e 2e 4d 65 74 61 64 61 74 61 50 72 6f 70 65 72  n.MetadataProper
5c20: 74 69 65 73 5b 22 53 74 6f 72 65 46 75 6e 63 74  ties["StoreFunct
5c30: 69 6f 6e 4e 61 6d 65 41 74 74 72 69 62 75 74 65  ionNameAttribute
5c40: 22 5d 2e 56 61 6c 75 65 3b 0d 0a 0d 0a 20 20 20  "].Value;....   
5c50: 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73     if (String.Is
5c60: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 75 73 65 72  NullOrEmpty(user
5c70: 43 6f 6d 6d 61 6e 64 54 65 78 74 29 29 0d 0a 20  CommandText)).. 
5c80: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5c90: 2f 2f 20 62 75 69 6c 64 20 61 20 71 75 6f 74 65  // build a quote
5ca0: 64 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  d description of
5cb0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0d 0a 20   the function.. 
5cc0: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 79         commandTy
5cd0: 70 65 20 3d 20 43 6f 6d 6d 61 6e 64 54 79 70 65  pe = CommandType
5ce0: 2e 53 74 6f 72 65 64 50 72 6f 63 65 64 75 72 65  .StoredProcedure
5cf0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20  ;....        // 
5d00: 69 66 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61  if the schema na
5d10: 6d 65 20 69 73 20 6e 6f 74 20 65 78 70 6c 69 63  me is not explic
5d20: 69 74 6c 79 20 67 69 76 65 6e 2c 20 69 74 20 69  itly given, it i
5d30: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
5d40: 74 68 65 20 6d 65 74 61 64 61 74 61 20 6e 61 6d  the metadata nam
5d50: 65 73 70 61 63 65 0d 0a 20 20 20 20 20 20 20 20  espace..        
5d60: 2f 2f 73 74 72 69 6e 67 20 73 63 68 65 6d 61 4e  //string schemaN
5d70: 61 6d 65 20 3d 20 53 74 72 69 6e 67 2e 49 73 4e  ame = String.IsN
5d80: 75 6c 6c 4f 72 45 6d 70 74 79 28 75 73 65 72 53  ullOrEmpty(userS
5d90: 63 68 65 6d 61 4e 61 6d 65 29 20 3f 0d 0a 20 20  chemaName) ?..  
5da0: 20 20 20 20 20 20 2f 2f 20 20 20 20 66 75 6e 63        //    func
5db0: 74 69 6f 6e 2e 4e 61 6d 65 73 70 61 63 65 4e 61  tion.NamespaceNa
5dc0: 6d 65 20 3a 20 75 73 65 72 53 63 68 65 6d 61 4e  me : userSchemaN
5dd0: 61 6d 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame;....        
5de0: 2f 2f 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  // if the functi
5df0: 6f 6e 20 73 74 6f 72 65 20 6e 61 6d 65 20 69 73  on store name is
5e00: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
5e10: 67 69 76 65 6e 2c 20 69 74 20 69 73 20 61 73 73  given, it is ass
5e20: 75 6d 65 64 20 74 6f 20 62 65 20 74 68 65 20 6d  umed to be the m
5e30: 65 74 61 64 61 74 61 20 6e 61 6d 65 0d 0a 20 20  etadata name..  
5e40: 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 75 6e        string fun
5e50: 63 74 69 6f 6e 4e 61 6d 65 20 3d 20 53 74 72 69  ctionName = Stri
5e60: 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
5e70: 28 75 73 65 72 46 75 6e 63 4e 61 6d 65 29 20 3f  (userFuncName) ?
5e80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 75  ..            fu
5e90: 6e 63 74 69 6f 6e 2e 4e 61 6d 65 20 3a 20 75 73  nction.Name : us
5ea0: 65 72 46 75 6e 63 4e 61 6d 65 3b 0d 0a 0d 0a 20  erFuncName;.... 
5eb0: 20 20 20 20 20 20 20 2f 2f 20 71 75 6f 74 65 20         // quote 
5ec0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 66 75 6e 63  elements of func
5ed0: 74 69 6f 6e 20 74 65 78 74 0d 0a 20 20 20 20 20  tion text..     
5ee0: 20 20 20 2f 2f 73 74 72 69 6e 67 20 71 75 6f 74     //string quot
5ef0: 65 64 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 51  edSchemaName = Q
5f00: 75 6f 74 65 49 64 65 6e 74 69 66 69 65 72 28 73  uoteIdentifier(s
5f10: 63 68 65 6d 61 4e 61 6d 65 29 3b 0d 0a 20 20 20  chemaName);..   
5f20: 20 20 20 20 20 73 74 72 69 6e 67 20 71 75 6f 74       string quot
5f30: 65 64 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 20 3d  edFunctionName =
5f40: 20 51 75 6f 74 65 49 64 65 6e 74 69 66 69 65 72   QuoteIdentifier
5f50: 28 66 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 3b 0d  (functionName);.
5f60: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 73 65  ...        // se
5f70: 70 61 72 61 74 6f 72 0d 0a 20 20 20 20 20 20 20  parator..       
5f80: 20 2f 2f 63 6f 6e 73 74 20 73 74 72 69 6e 67 20   //const string 
5f90: 73 63 68 65 6d 61 53 65 70 61 72 61 74 6f 72 20  schemaSeparator 
5fa0: 3d 20 22 2e 22 3b 0d 0a 0d 0a 20 20 20 20 20 20  = ".";....      
5fb0: 20 20 2f 2f 20 63 6f 6e 63 61 74 65 6e 61 74 65    // concatenate
5fc0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 66 75 6e   elements of fun
5fd0: 63 74 69 6f 6e 20 74 65 78 74 0d 0a 20 20 20 20  ction text..    
5fe0: 20 20 20 20 73 74 72 69 6e 67 20 71 75 6f 74 65      string quote
5ff0: 64 46 75 6e 63 74 69 6f 6e 54 65 78 74 20 3d 20  dFunctionText = 
6000: 2f 2a 20 71 75 6f 74 65 64 53 63 68 65 6d 61 4e  /* quotedSchemaN
6010: 61 6d 65 20 2b 20 73 63 68 65 6d 61 53 65 70 61  ame + schemaSepa
6020: 72 61 74 6f 72 20 2b 20 2a 2f 20 71 75 6f 74 65  rator + */ quote
6030: 64 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3b 0d 0a  dFunctionName;..
6040: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6050: 20 71 75 6f 74 65 64 46 75 6e 63 74 69 6f 6e 54   quotedFunctionT
6060: 65 78 74 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ext;..      }.. 
6070: 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
6080: 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 69   {..        // i
6090: 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 73  f the user has s
60a0: 70 65 63 69 66 69 65 64 20 74 68 65 20 63 6f 6d  pecified the com
60b0: 6d 61 6e 64 20 74 65 78 74 2c 20 70 61 73 73 20  mand text, pass 
60c0: 69 74 20 74 68 72 6f 75 67 68 20 76 65 72 62 61  it through verba
60d0: 74 69 6d 20 61 6e 64 20 63 68 6f 6f 73 65 20 43  tim and choose C
60e0: 6f 6d 6d 61 6e 64 54 79 70 65 2e 54 65 78 74 0d  ommandType.Text.
60f0: 0a 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64  .        command
6100: 54 79 70 65 20 3d 20 43 6f 6d 6d 61 6e 64 54 79  Type = CommandTy
6110: 70 65 2e 54 65 78 74 3b 0d 0a 20 20 20 20 20 20  pe.Text;..      
6120: 20 20 72 65 74 75 72 6e 20 75 73 65 72 43 6f 6d    return userCom
6130: 6d 61 6e 64 54 65 78 74 3b 0d 0a 20 20 20 20 20  mandText;..     
6140: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
6150: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
6160: 20 20 20 20 2f 2f 2f 20 43 6f 6e 76 65 72 74 20      /// Convert 
6170: 74 68 65 20 53 51 4c 20 66 72 61 67 6d 65 6e 74  the SQL fragment
6180: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 2e 0d 0a  s to a string...
6190: 20 20 20 20 2f 2f 2f 20 57 65 20 68 61 76 65 20      /// We have 
61a0: 74 6f 20 73 65 74 75 70 20 74 68 65 20 53 74 72  to setup the Str
61b0: 65 61 6d 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  eam for writing.
61c0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
61d0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ary>..    /// <p
61e0: 61 72 61 6d 20 6e 61 6d 65 3d 22 73 71 6c 53 74  aram name="sqlSt
61f0: 61 74 65 6d 65 6e 74 22 3e 3c 2f 70 61 72 61 6d  atement"></param
6200: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
6210: 72 6e 73 3e 41 20 73 74 72 69 6e 67 20 72 65 70  rns>A string rep
6220: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 53 51  resenting the SQ
6230: 4c 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  L to be executed
6240: 2e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  .</returns>..   
6250: 20 73 74 72 69 6e 67 20 57 72 69 74 65 53 71 6c   string WriteSql
6260: 28 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 73 71  (ISqlFragment sq
6270: 6c 53 74 61 74 65 6d 65 6e 74 29 0d 0a 20 20 20  lStatement)..   
6280: 20 7b 0d 0a 20 20 20 20 20 20 53 74 72 69 6e 67   {..      String
6290: 42 75 69 6c 64 65 72 20 62 75 69 6c 64 65 72 20  Builder builder 
62a0: 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75 69 6c  = new StringBuil
62b0: 64 65 72 28 31 30 32 34 29 3b 0d 0a 20 20 20 20  der(1024);..    
62c0: 20 20 75 73 69 6e 67 20 28 53 71 6c 57 72 69 74    using (SqlWrit
62d0: 65 72 20 77 72 69 74 65 72 20 3d 20 6e 65 77 20  er writer = new 
62e0: 53 71 6c 57 72 69 74 65 72 28 62 75 69 6c 64 65  SqlWriter(builde
62f0: 72 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  r))..      {..  
6300: 20 20 20 20 20 20 73 71 6c 53 74 61 74 65 6d 65        sqlStateme
6310: 6e 74 2e 57 72 69 74 65 53 71 6c 28 77 72 69 74  nt.WriteSql(writ
6320: 65 72 2c 20 74 68 69 73 29 3b 0d 0a 20 20 20 20  er, this);..    
6330: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
6340: 75 72 6e 20 62 75 69 6c 64 65 72 2e 54 6f 53 74  urn builder.ToSt
6350: 72 69 6e 67 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a  ring();..    }..
6360: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
6370: 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f  ..    private bo
6380: 6f 6c 20 54 72 79 54 72 61 6e 73 6c 61 74 65 49  ol TryTranslateI
6390: 6e 74 6f 49 6e 28 44 62 4f 72 45 78 70 72 65 73  ntoIn(DbOrExpres
63a0: 73 69 6f 6e 20 65 2c 20 6f 75 74 20 49 53 71 6c  sion e, out ISql
63b0: 46 72 61 67 6d 65 6e 74 20 73 71 6c 46 72 61 67  Fragment sqlFrag
63c0: 6d 65 6e 74 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  ment)..    {..  
63d0: 20 20 20 20 4b 65 79 54 6f 4c 69 73 74 4d 61 70      KeyToListMap
63e0: 3c 44 62 45 78 70 72 65 73 73 69 6f 6e 2c 20 44  <DbExpression, D
63f0: 62 45 78 70 72 65 73 73 69 6f 6e 3e 20 76 61 6c  bExpression> val
6400: 75 65 73 20 3d 20 6e 65 77 20 4b 65 79 54 6f 4c  ues = new KeyToL
6410: 69 73 74 4d 61 70 3c 44 62 45 78 70 72 65 73 73  istMap<DbExpress
6420: 69 6f 6e 2c 20 44 62 45 78 70 72 65 73 73 69 6f  ion, DbExpressio
6430: 6e 3e 28 4b 65 79 46 69 65 6c 64 45 78 70 72 65  n>(KeyFieldExpre
6440: 73 73 69 6f 6e 43 6f 6d 70 61 72 65 72 2e 53 69  ssionComparer.Si
6450: 6e 67 6c 65 74 6f 6e 29 3b 0d 0a 20 20 20 20 20  ngleton);..     
6460: 20 69 66 20 28 21 28 74 68 69 73 2e 48 61 73 42   if (!(this.HasB
6470: 75 69 6c 74 4d 61 70 46 6f 72 49 6e 28 65 2c 20  uiltMapForIn(e, 
6480: 76 61 6c 75 65 73 29 20 26 26 20 28 76 61 6c 75  values) && (valu
6490: 65 73 2e 4b 65 79 73 2e 43 6f 75 6e 74 3c 44 62  es.Keys.Count<Db
64a0: 45 78 70 72 65 73 73 69 6f 6e 3e 28 29 20 3e 20  Expression>() > 
64b0: 30 29 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  0)))..      {.. 
64c0: 20 20 20 20 20 20 20 73 71 6c 46 72 61 67 6d 65         sqlFragme
64d0: 6e 74 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  nt = null;..    
64e0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
64f0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
6500: 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73    SqlBuilder res
6510: 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69  ult = new SqlBui
6520: 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 62  lder();..      b
6530: 6f 6f 6c 20 66 6c 61 67 32 20 3d 20 74 72 75 65  ool flag2 = true
6540: 3b 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ;..      foreach
6550: 20 28 44 62 45 78 70 72 65 73 73 69 6f 6e 20 65   (DbExpression e
6560: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 76 61 6c  xpression in val
6570: 75 65 73 2e 4b 65 79 73 29 0d 0a 20 20 20 20 20  ues.Keys)..     
6580: 20 7b 0d 0a 20 20 20 20 20 20 20 20 52 65 61 64   {..        Read
6590: 4f 6e 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 3c 44  OnlyCollection<D
65a0: 62 45 78 70 72 65 73 73 69 6f 6e 3e 20 73 6f 75  bExpression> sou
65b0: 72 63 65 20 3d 20 76 61 6c 75 65 73 2e 4c 69 73  rce = values.Lis
65c0: 74 46 6f 72 4b 65 79 28 65 78 70 72 65 73 73 69  tForKey(expressi
65d0: 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66  on);..        if
65e0: 20 28 21 66 6c 61 67 32 29 0d 0a 20 20 20 20 20   (!flag2)..     
65f0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
6600: 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 20  result.Append(" 
6610: 4f 52 20 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  OR ");..        
6620: 7d 0d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0d  }..        else.
6630: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
6640: 20 20 20 20 20 20 66 6c 61 67 32 20 3d 20 66 61        flag2 = fa
6650: 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  lse;..        }.
6660: 0a 20 20 20 20 20 20 20 20 49 45 6e 75 6d 65 72  .        IEnumer
6670: 61 62 6c 65 3c 44 62 45 78 70 72 65 73 73 69 6f  able<DbExpressio
6680: 6e 3e 20 65 6e 75 6d 65 72 61 62 6c 65 20 3d 20  n> enumerable = 
6690: 73 6f 75 72 63 65 2e 57 68 65 72 65 3c 44 62 45  source.Where<DbE
66a0: 78 70 72 65 73 73 69 6f 6e 3e 28 64 65 6c 65 67  xpression>(deleg
66b0: 61 74 65 28 44 62 45 78 70 72 65 73 73 69 6f 6e  ate(DbExpression
66c0: 20 76 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a   v)..        {..
66d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
66e0: 20 76 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e   v.ExpressionKin
66f0: 64 20 21 3d 20 44 62 45 78 70 72 65 73 73 69 6f  d != DbExpressio
6700: 6e 4b 69 6e 64 2e 49 73 4e 75 6c 6c 3b 0d 0a 20  nKind.IsNull;.. 
6710: 20 20 20 20 20 20 20 7d 29 3b 0d 0a 20 20 20 20         });..    
6720: 20 20 20 20 69 6e 74 20 6e 75 6d 20 3d 20 65 6e      int num = en
6730: 75 6d 65 72 61 62 6c 65 2e 43 6f 75 6e 74 3c 44  umerable.Count<D
6740: 62 45 78 70 72 65 73 73 69 6f 6e 3e 28 29 3b 0d  bExpression>();.
6750: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 75 6d  .        if (num
6760: 20 3d 3d 20 31 29 0d 0a 20 20 20 20 20 20 20 20   == 1)..        
6770: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 68 69  {..          thi
6780: 73 2e 50 61 72 61 6e 74 68 65 73 69 7a 65 45 78  s.ParanthesizeEx
6790: 70 72 65 73 73 69 6f 6e 49 66 4e 65 65 64 65 64  pressionIfNeeded
67a0: 28 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 73  (expression, res
67b0: 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ult);..         
67c0: 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22   result.Append("
67d0: 20 3d 20 22 29 3b 0d 0a 20 20 20 20 20 20 20 20   = ");..        
67e0: 20 20 44 62 45 78 70 72 65 73 73 69 6f 6e 20 65    DbExpression e
67f0: 78 70 72 65 73 73 69 6f 6e 32 20 3d 20 65 6e 75  xpression2 = enu
6800: 6d 65 72 61 62 6c 65 2e 46 69 72 73 74 3c 44 62  merable.First<Db
6810: 45 78 70 72 65 73 73 69 6f 6e 3e 28 29 3b 0d 0a  Expression>();..
6820: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 50            this.P
6830: 61 72 65 6e 74 68 65 73 69 7a 65 45 78 70 72 65  arenthesizeExpre
6840: 73 73 69 6f 6e 57 69 74 68 6f 75 74 52 65 64 75  ssionWithoutRedu
6850: 6e 64 61 6e 74 43 6f 6e 73 74 61 6e 74 43 61 73  ndantConstantCas
6860: 74 73 28 65 78 70 72 65 73 73 69 6f 6e 32 2c 20  ts(expression2, 
6870: 72 65 73 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20  result);..      
6880: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 20    }..        if 
6890: 28 6e 75 6d 20 3e 20 31 29 0d 0a 20 20 20 20 20  (num > 1)..     
68a0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
68b0: 74 68 69 73 2e 50 61 72 61 6e 74 68 65 73 69 7a  this.Paranthesiz
68c0: 65 45 78 70 72 65 73 73 69 6f 6e 49 66 4e 65 65  eExpressionIfNee
68d0: 64 65 64 28 65 78 70 72 65 73 73 69 6f 6e 2c 20  ded(expression, 
68e0: 72 65 73 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20  result);..      
68f0: 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e      result.Appen
6900: 64 28 22 20 49 4e 20 28 22 29 3b 0d 0a 20 20 20  d(" IN (");..   
6910: 20 20 20 20 20 20 20 62 6f 6f 6c 20 66 6c 61 67         bool flag
6920: 33 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  3 = true;..     
6930: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 44 62       foreach (Db
6940: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
6950: 73 73 69 6f 6e 33 20 69 6e 20 65 6e 75 6d 65 72  ssion3 in enumer
6960: 61 62 6c 65 29 0d 0a 20 20 20 20 20 20 20 20 20  able)..         
6970: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6980: 69 66 20 28 21 66 6c 61 67 33 29 0d 0a 20 20 20  if (!flag3)..   
6990: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
69a0: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
69b0: 2e 41 70 70 65 6e 64 28 22 2c 22 29 3b 0d 0a 20  .Append(",");.. 
69c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
69d0: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a            else..
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61               fla
6a00: 67 33 20 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20  g3 = false;..   
6a10: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6a20: 20 20 20 20 20 20 20 20 74 68 69 73 2e 50 61 72          this.Par
6a30: 65 6e 74 68 65 73 69 7a 65 45 78 70 72 65 73 73  enthesizeExpress
6a40: 69 6f 6e 57 69 74 68 6f 75 74 52 65 64 75 6e 64  ionWithoutRedund
6a50: 61 6e 74 43 6f 6e 73 74 61 6e 74 43 61 73 74 73  antConstantCasts
6a60: 28 65 78 70 72 65 73 73 69 6f 6e 33 2c 20 72 65  (expression3, re
6a70: 73 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20 20 20  sult);..        
6a80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 72    }..          r
6a90: 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 29 22  esult.Append(")"
6aa0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
6ab0: 20 20 20 20 20 20 20 44 62 49 73 4e 75 6c 6c 45         DbIsNullE
6ac0: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
6ad0: 73 69 6f 6e 34 20 3d 20 73 6f 75 72 63 65 2e 46  sion4 = source.F
6ae0: 69 72 73 74 4f 72 44 65 66 61 75 6c 74 3c 44 62  irstOrDefault<Db
6af0: 45 78 70 72 65 73 73 69 6f 6e 3e 28 64 65 6c 65  Expression>(dele
6b00: 67 61 74 65 28 44 62 45 78 70 72 65 73 73 69 6f  gate(DbExpressio
6b10: 6e 20 76 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  n v)..        {.
6b20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
6b30: 6e 20 28 76 2e 45 78 70 72 65 73 73 69 6f 6e 4b  n (v.ExpressionK
6b40: 69 6e 64 20 3d 3d 20 44 62 45 78 70 72 65 73 73  ind == DbExpress
6b50: 69 6f 6e 4b 69 6e 64 2e 49 73 4e 75 6c 6c 29 3b  ionKind.IsNull);
6b60: 0d 0a 20 20 20 20 20 20 20 20 7d 29 20 61 73 20  ..        }) as 
6b70: 44 62 49 73 4e 75 6c 6c 45 78 70 72 65 73 73 69  DbIsNullExpressi
6b80: 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  on;..        if 
6b90: 28 65 78 70 72 65 73 73 69 6f 6e 34 20 21 3d 20  (expression4 != 
6ba0: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 7b  null)..        {
6bb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
6bc0: 6e 75 6d 20 3e 20 30 29 0d 0a 20 20 20 20 20 20  num > 0)..      
6bd0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6be0: 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
6bf0: 28 22 20 4f 52 20 22 29 3b 0d 0a 20 20 20 20 20  (" OR ");..     
6c00: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
6c10: 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
6c20: 74 68 69 73 2e 56 69 73 69 74 49 73 4e 75 6c 6c  this.VisitIsNull
6c30: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
6c40: 73 73 69 6f 6e 34 2c 20 66 61 6c 73 65 29 29 3b  ssion4, false));
6c50: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
6c60: 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 71 6c 46     }..      sqlF
6c70: 72 61 67 6d 65 6e 74 20 3d 20 72 65 73 75 6c 74  ragment = result
6c80: 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
6c90: 74 72 75 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  true;..    }....
6ca0: 20 20 20 20 23 72 65 67 69 6f 6e 20 44 62 45 78      #region DbEx
6cb0: 70 72 65 73 73 69 6f 6e 56 69 73 69 74 6f 72 20  pressionVisitor 
6cc0: 4d 65 6d 62 65 72 73 0d 0a 0d 0a 20 20 20 20 2f  Members....    /
6cd0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
6ce0: 20 20 2f 2f 2f 20 54 72 61 6e 73 6c 61 74 65 28    /// Translate(
6cf0: 6c 65 66 74 29 20 41 4e 44 20 54 72 61 6e 73 6c  left) AND Transl
6d00: 61 74 65 28 72 69 67 68 74 29 0d 0a 20 20 20 20  ate(right)..    
6d10: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
6d20: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
6d30: 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e  ame="e"></param>
6d40: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72  ..    /// <retur
6d50: 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d 22  ns>A <see cref="
6d60: 53 71 6c 42 75 69 6c 64 65 72 22 2f 3e 2e 3c 2f  SqlBuilder"/>.</
6d70: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75  returns>..    pu
6d80: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49 53  blic override IS
6d90: 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74  qlFragment Visit
6da0: 28 44 62 41 6e 64 45 78 70 72 65 73 73 69 6f 6e  (DbAndExpression
6db0: 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20   e)..    {..    
6dc0: 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 42 69    return VisitBi
6dd0: 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 22  naryExpression("
6de0: 20 41 4e 44 20 22 2c 20 65 2e 4c 65 66 74 2c 20   AND ", e.Left, 
6df0: 65 2e 52 69 67 68 74 29 3b 0d 0a 20 20 20 20 7d  e.Right);..    }
6e00: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
6e10: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41  mary>..    /// A
6e20: 6e 20 61 70 70 6c 79 20 69 73 20 6a 75 73 74 20  n apply is just 
6e30: 6c 69 6b 65 20 61 20 6a 6f 69 6e 2c 20 73 6f 20  like a join, so 
6e40: 69 74 20 73 68 61 72 65 73 20 74 68 65 20 63 6f  it shares the co
6e50: 6d 6d 6f 6e 20 6a 6f 69 6e 20 70 72 6f 63 65 73  mmon join proces
6e60: 73 69 6e 67 0d 0a 20 20 20 20 2f 2f 2f 20 69 6e  sing..    /// in
6e70: 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69 73 69   <see cref="Visi
6e80: 74 4a 6f 69 6e 45 78 70 72 65 73 73 69 6f 6e 22  tJoinExpression"
6e90: 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  />..    /// </su
6ea0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
6eb0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e  <param name="e">
6ec0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
6ed0: 2f 20 3c 72 65 74 75 72 6e 73 3e 41 20 3c 73 65  / <returns>A <se
6ee0: 65 20 63 72 65 66 3d 22 53 71 6c 53 65 6c 65 63  e cref="SqlSelec
6ef0: 74 53 74 61 74 65 6d 65 6e 74 22 2f 3e 2e 3c 2f  tStatement"/>.</
6f00: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75  returns>..    pu
6f10: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49 53  blic override IS
6f20: 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74  qlFragment Visit
6f30: 28 44 62 41 70 70 6c 79 45 78 70 72 65 73 73 69  (DbApplyExpressi
6f40: 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  on e)..    {..  
6f50: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f      throw new No
6f60: 74 53 75 70 70 6f 72 74 65 64 45 78 63 65 70 74  tSupportedExcept
6f70: 69 6f 6e 28 22 41 50 50 4c 59 20 6a 6f 69 6e 73  ion("APPLY joins
6f80: 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
6f90: 65 64 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ed");..    }....
6fa0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
6fb0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 46 6f 72 20 62  >..    /// For b
6fc0: 69 6e 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  inary expression
6fd0: 73 2c 20 77 65 20 64 65 6c 65 67 61 74 65 20 74  s, we delegate t
6fe0: 6f 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69 73  o <see cref="Vis
6ff0: 69 74 42 69 6e 61 72 79 45 78 70 72 65 73 73 69  itBinaryExpressi
7000: 6f 6e 22 2f 3e 2e 0d 0a 20 20 20 20 2f 2f 2f 20  on"/>...    /// 
7010: 57 65 20 68 61 6e 64 6c 65 20 74 68 65 20 6f 74  We handle the ot
7020: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  her expressions 
7030: 64 69 72 65 63 74 6c 79 2e 0d 0a 20 20 20 20 2f  directly...    /
7040: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
7050: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
7060: 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  me="e"></param>.
7070: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
7080: 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d 22 53  s>A <see cref="S
7090: 71 6c 42 75 69 6c 64 65 72 22 2f 3e 3c 2f 72 65  qlBuilder"/></re
70a0: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c  turns>..    publ
70b0: 69 63 20 6f 76 65 72 72 69 64 65 20 49 53 71 6c  ic override ISql
70c0: 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74 28 44  Fragment Visit(D
70d0: 62 41 72 69 74 68 6d 65 74 69 63 45 78 70 72 65  bArithmeticExpre
70e0: 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d  ssion e)..    {.
70f0: 0a 20 20 20 20 20 20 53 71 6c 42 75 69 6c 64 65  .      SqlBuilde
7100: 72 20 72 65 73 75 6c 74 3b 0d 0a 0d 0a 20 20 20  r result;....   
7110: 20 20 20 73 77 69 74 63 68 20 28 65 2e 45 78 70     switch (e.Exp
7120: 72 65 73 73 69 6f 6e 4b 69 6e 64 29 0d 0a 20 20  ressionKind)..  
7130: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63      {..        c
7140: 61 73 65 20 44 62 45 78 70 72 65 73 73 69 6f 6e  ase DbExpression
7150: 4b 69 6e 64 2e 44 69 76 69 64 65 3a 0d 0a 20 20  Kind.Divide:..  
7160: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
7170: 20 56 69 73 69 74 42 69 6e 61 72 79 45 78 70 72   VisitBinaryExpr
7180: 65 73 73 69 6f 6e 28 22 20 2f 20 22 2c 20 65 2e  ession(" / ", e.
7190: 41 72 67 75 6d 65 6e 74 73 5b 30 5d 2c 20 65 2e  Arguments[0], e.
71a0: 41 72 67 75 6d 65 6e 74 73 5b 31 5d 29 3b 0d 0a  Arguments[1]);..
71b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
71c0: 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 44  ..        case D
71d0: 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e  bExpressionKind.
71e0: 4d 69 6e 75 73 3a 0d 0a 20 20 20 20 20 20 20 20  Minus:..        
71f0: 20 20 72 65 73 75 6c 74 20 3d 20 56 69 73 69 74    result = Visit
7200: 42 69 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e  BinaryExpression
7210: 28 22 20 2d 20 22 2c 20 65 2e 41 72 67 75 6d 65  (" - ", e.Argume
7220: 6e 74 73 5b 30 5d 2c 20 65 2e 41 72 67 75 6d 65  nts[0], e.Argume
7230: 6e 74 73 5b 31 5d 29 3b 0d 0a 20 20 20 20 20 20  nts[1]);..      
7240: 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
7250: 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65      case DbExpre
7260: 73 73 69 6f 6e 4b 69 6e 64 2e 4d 6f 64 75 6c 6f  ssionKind.Modulo
7270: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  :..          res
7280: 75 6c 74 20 3d 20 56 69 73 69 74 42 69 6e 61 72  ult = VisitBinar
7290: 79 45 78 70 72 65 73 73 69 6f 6e 28 22 20 25 20  yExpression(" % 
72a0: 22 2c 20 65 2e 41 72 67 75 6d 65 6e 74 73 5b 30  ", e.Arguments[0
72b0: 5d 2c 20 65 2e 41 72 67 75 6d 65 6e 74 73 5b 31  ], e.Arguments[1
72c0: 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  ]);..          b
72d0: 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63  reak;..        c
72e0: 61 73 65 20 44 62 45 78 70 72 65 73 73 69 6f 6e  ase DbExpression
72f0: 4b 69 6e 64 2e 4d 75 6c 74 69 70 6c 79 3a 0d 0a  Kind.Multiply:..
7300: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
7310: 20 3d 20 56 69 73 69 74 42 69 6e 61 72 79 45 78   = VisitBinaryEx
7320: 70 72 65 73 73 69 6f 6e 28 22 20 2a 20 22 2c 20  pression(" * ", 
7330: 65 2e 41 72 67 75 6d 65 6e 74 73 5b 30 5d 2c 20  e.Arguments[0], 
7340: 65 2e 41 72 67 75 6d 65 6e 74 73 5b 31 5d 29 3b  e.Arguments[1]);
7350: 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ..          brea
7360: 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65  k;..        case
7370: 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e   DbExpressionKin
7380: 64 2e 50 6c 75 73 3a 0d 0a 20 20 20 20 20 20 20  d.Plus:..       
7390: 20 20 20 72 65 73 75 6c 74 20 3d 20 56 69 73 69     result = Visi
73a0: 74 42 69 6e 61 72 79 45 78 70 72 65 73 73 69 6f  tBinaryExpressio
73b0: 6e 28 22 20 2b 20 22 2c 20 65 2e 41 72 67 75 6d  n(" + ", e.Argum
73c0: 65 6e 74 73 5b 30 5d 2c 20 65 2e 41 72 67 75 6d  ents[0], e.Argum
73d0: 65 6e 74 73 5b 31 5d 29 3b 0d 0a 20 20 20 20 20  ents[1]);..     
73e0: 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20       break;.... 
73f0: 20 20 20 20 20 20 20 63 61 73 65 20 44 62 45 78         case DbEx
7400: 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 55 6e 61  pressionKind.Una
7410: 72 79 4d 69 6e 75 73 3a 0d 0a 20 20 20 20 20 20  ryMinus:..      
7420: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 6e 65 77      result = new
7430: 20 53 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d 0a   SqlBuilder();..
7440: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
7450: 2e 41 70 70 65 6e 64 28 22 20 2d 28 22 29 3b 0d  .Append(" -(");.
7460: 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c  .          resul
7470: 74 2e 41 70 70 65 6e 64 28 65 2e 41 72 67 75 6d  t.Append(e.Argum
7480: 65 6e 74 73 5b 30 5d 2e 41 63 63 65 70 74 28 74  ents[0].Accept(t
7490: 68 69 73 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  his));..        
74a0: 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
74b0: 22 29 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ")");..         
74c0: 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20   break;....     
74d0: 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20     default:..   
74e0: 20 20 20 20 20 20 20 44 65 62 75 67 2e 41 73 73         Debug.Ass
74f0: 65 72 74 28 66 61 6c 73 65 29 3b 0d 0a 20 20 20  ert(false);..   
7500: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
7510: 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f   InvalidOperatio
7520: 6e 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20  nException();.. 
7530: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7540: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a  return result;..
7550: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
7560: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
7570: 2f 2f 2f 20 49 66 20 74 68 65 20 45 4c 53 45 20  /// If the ELSE 
7580: 63 6c 61 75 73 65 20 69 73 20 6e 75 6c 6c 2c 20  clause is null, 
7590: 77 65 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  we do not write 
75a0: 69 74 20 6f 75 74 2e 0d 0a 20 20 20 20 2f 2f 2f  it out...    ///
75b0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
75c0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
75d0: 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ="e"></param>.. 
75e0: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
75f0: 41 20 3c 73 65 65 20 63 72 65 66 3d 22 53 71 6c  A <see cref="Sql
7600: 42 75 69 6c 64 65 72 22 2f 3e 3c 2f 72 65 74 75  Builder"/></retu
7610: 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63  rns>..    public
7620: 20 6f 76 65 72 72 69 64 65 20 49 53 71 6c 46 72   override ISqlFr
7630: 61 67 6d 65 6e 74 20 56 69 73 69 74 28 44 62 43  agment Visit(DbC
7640: 61 73 65 45 78 70 72 65 73 73 69 6f 6e 20 65 29  aseExpression e)
7650: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53  ..    {..      S
7660: 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c 74  qlBuilder result
7670: 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64 65   = new SqlBuilde
7680: 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 44 65  r();....      De
7690: 62 75 67 2e 41 73 73 65 72 74 28 65 2e 57 68 65  bug.Assert(e.Whe
76a0: 6e 2e 43 6f 75 6e 74 20 3d 3d 20 65 2e 54 68 65  n.Count == e.The
76b0: 6e 2e 43 6f 75 6e 74 29 3b 0d 0a 0d 0a 20 20 20  n.Count);....   
76c0: 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
76d0: 28 22 43 41 53 45 22 29 3b 0d 0a 20 20 20 20 20  ("CASE");..     
76e0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
76f0: 20 69 20 3c 20 65 2e 57 68 65 6e 2e 43 6f 75 6e   i < e.When.Coun
7700: 74 3b 20 2b 2b 69 29 0d 0a 20 20 20 20 20 20 7b  t; ++i)..      {
7710: 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  ..        result
7720: 2e 41 70 70 65 6e 64 28 22 20 57 48 45 4e 20 28  .Append(" WHEN (
7730: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73  ");..        res
7740: 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e 57 68 65  ult.Append(e.Whe
7750: 6e 5b 69 5d 2e 41 63 63 65 70 74 28 74 68 69 73  n[i].Accept(this
7760: 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73  ));..        res
7770: 75 6c 74 2e 41 70 70 65 6e 64 28 22 29 20 54 48  ult.Append(") TH
7780: 45 4e 20 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  EN ");..        
7790: 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e  result.Append(e.
77a0: 54 68 65 6e 5b 69 5d 2e 41 63 63 65 70 74 28 74  Then[i].Accept(t
77b0: 68 69 73 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  his));..      }.
77c0: 0a 20 20 20 20 20 20 69 66 20 28 65 2e 45 6c 73  .      if (e.Els
77d0: 65 20 21 3d 20 6e 75 6c 6c 20 26 26 20 21 28 65  e != null && !(e
77e0: 2e 45 6c 73 65 20 69 73 20 44 62 4e 75 6c 6c 45  .Else is DbNullE
77f0: 78 70 72 65 73 73 69 6f 6e 29 29 0d 0a 20 20 20  xpression))..   
7800: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65     {..        re
7810: 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 20 45 4c  sult.Append(" EL
7820: 53 45 20 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  SE ");..        
7830: 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e  result.Append(e.
7840: 45 6c 73 65 2e 41 63 63 65 70 74 28 74 68 69 73  Else.Accept(this
7850: 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ));..      }....
7860: 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
7870: 65 6e 64 28 22 20 45 4e 44 22 29 3b 0d 0a 0d 0a  end(" END");....
7880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73        return res
7890: 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ult;..    }.... 
78a0: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
78b0: 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f  ..    ///..    /
78c0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
78d0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
78e0: 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  me="e"></param>.
78f0: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
7900: 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  s></returns>..  
7910: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
7920: 65 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56  e ISqlFragment V
7930: 69 73 69 74 28 44 62 43 61 73 74 45 78 70 72 65  isit(DbCastExpre
7940: 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d  ssion e)..    {.
7950: 0a 20 20 20 20 20 20 53 71 6c 42 75 69 6c 64 65  .      SqlBuilde
7960: 72 20 72 65 73 75 6c 74 20 3d 20 6e 65 77 20 53  r result = new S
7970: 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20  qlBuilder();..  
7980: 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e      result.Appen
7990: 64 28 65 2e 41 72 67 75 6d 65 6e 74 2e 41 63 63  d(e.Argument.Acc
79a0: 65 70 74 28 74 68 69 73 29 29 3b 0d 0a 20 20 20  ept(this));..   
79b0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
79c0: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
79d0: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
79e0: 20 20 20 2f 2f 2f 20 54 68 65 20 70 61 72 73 65     /// The parse
79f0: 72 20 67 65 6e 65 72 61 74 65 73 20 4e 6f 74 28  r generates Not(
7a00: 45 71 75 61 6c 73 28 2e 2e 2e 29 29 20 66 6f 72  Equals(...)) for
7a10: 20 26 6c 74 3b 26 67 74 3b 2e 0d 0a 20 20 20 20   &lt;&gt;...    
7a20: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
7a30: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
7a40: 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e  ame="e"></param>
7a50: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72  ..    /// <retur
7a60: 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d 22  ns>A <see cref="
7a70: 53 71 6c 42 75 69 6c 64 65 72 22 2f 3e 2e 3c 2f  SqlBuilder"/>.</
7a80: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75  returns>..    pu
7a90: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49 53  blic override IS
7aa0: 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74  qlFragment Visit
7ab0: 28 44 62 43 6f 6d 70 61 72 69 73 6f 6e 45 78 70  (DbComparisonExp
7ac0: 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ression e)..    
7ad0: 7b 0d 0a 20 20 20 20 20 20 53 71 6c 42 75 69 6c  {..      SqlBuil
7ae0: 64 65 72 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20  der result;..   
7af0: 20 20 20 73 77 69 74 63 68 20 28 65 2e 45 78 70     switch (e.Exp
7b00: 72 65 73 73 69 6f 6e 4b 69 6e 64 29 0d 0a 20 20  ressionKind)..  
7b10: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63      {..        c
7b20: 61 73 65 20 44 62 45 78 70 72 65 73 73 69 6f 6e  ase DbExpression
7b30: 4b 69 6e 64 2e 45 71 75 61 6c 73 3a 0d 0a 20 20  Kind.Equals:..  
7b40: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
7b50: 20 3d 20 56 69 73 69 74 42 69 6e 61 72 79 45 78   = VisitBinaryEx
7b60: 70 72 65 73 73 69 6f 6e 28 22 20 3d 20 22 2c 20  pression(" = ", 
7b70: 65 2e 4c 65 66 74 2c 20 65 2e 52 69 67 68 74 29  e.Left, e.Right)
7b80: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ;..          bre
7b90: 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73  ak;..        cas
7ba0: 65 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69  e DbExpressionKi
7bb0: 6e 64 2e 4c 65 73 73 54 68 61 6e 3a 0d 0a 20 20  nd.LessThan:..  
7bc0: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
7bd0: 20 56 69 73 69 74 42 69 6e 61 72 79 45 78 70 72   VisitBinaryExpr
7be0: 65 73 73 69 6f 6e 28 22 20 3c 20 22 2c 20 65 2e  ession(" < ", e.
7bf0: 4c 65 66 74 2c 20 65 2e 52 69 67 68 74 29 3b 0d  Left, e.Right);.
7c00: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7c10: 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ;..        case 
7c20: 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64  DbExpressionKind
7c30: 2e 4c 65 73 73 54 68 61 6e 4f 72 45 71 75 61 6c  .LessThanOrEqual
7c40: 73 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  s:..          re
7c50: 73 75 6c 74 20 3d 20 56 69 73 69 74 42 69 6e 61  sult = VisitBina
7c60: 72 79 45 78 70 72 65 73 73 69 6f 6e 28 22 20 3c  ryExpression(" <
7c70: 3d 20 22 2c 20 65 2e 4c 65 66 74 2c 20 65 2e 52  = ", e.Left, e.R
7c80: 69 67 68 74 29 3b 0d 0a 20 20 20 20 20 20 20 20  ight);..        
7c90: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
7ca0: 20 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73    case DbExpress
7cb0: 69 6f 6e 4b 69 6e 64 2e 47 72 65 61 74 65 72 54  ionKind.GreaterT
7cc0: 68 61 6e 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  han:..          
7cd0: 72 65 73 75 6c 74 20 3d 20 56 69 73 69 74 42 69  result = VisitBi
7ce0: 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 22  naryExpression("
7cf0: 20 3e 20 22 2c 20 65 2e 4c 65 66 74 2c 20 65 2e   > ", e.Left, e.
7d00: 52 69 67 68 74 29 3b 0d 0a 20 20 20 20 20 20 20  Right);..       
7d10: 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
7d20: 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65 73     case DbExpres
7d30: 73 69 6f 6e 4b 69 6e 64 2e 47 72 65 61 74 65 72  sionKind.Greater
7d40: 54 68 61 6e 4f 72 45 71 75 61 6c 73 3a 0d 0a 20  ThanOrEquals:.. 
7d50: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20           result 
7d60: 3d 20 56 69 73 69 74 42 69 6e 61 72 79 45 78 70  = VisitBinaryExp
7d70: 72 65 73 73 69 6f 6e 28 22 20 3e 3d 20 22 2c 20  ression(" >= ", 
7d80: 65 2e 4c 65 66 74 2c 20 65 2e 52 69 67 68 74 29  e.Left, e.Right)
7d90: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ;..          bre
7da0: 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20  ak;..        // 
7db0: 54 68 65 20 70 61 72 73 65 72 20 64 6f 65 73 20  The parser does 
7dc0: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 74 68 65  not generate the
7dd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6b 69 6e 64   expression kind
7de0: 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 20   below...       
7df0: 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73 69   case DbExpressi
7e00: 6f 6e 4b 69 6e 64 2e 4e 6f 74 45 71 75 61 6c 73  onKind.NotEquals
7e10: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  :..          res
7e20: 75 6c 74 20 3d 20 56 69 73 69 74 42 69 6e 61 72  ult = VisitBinar
7e30: 79 45 78 70 72 65 73 73 69 6f 6e 28 22 20 3c 3e  yExpression(" <>
7e40: 20 22 2c 20 65 2e 4c 65 66 74 2c 20 65 2e 52 69   ", e.Left, e.Ri
7e50: 67 68 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ght);..         
7e60: 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20   break;....     
7e70: 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20     default:..   
7e80: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
7e90: 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f   InvalidOperatio
7ea0: 6e 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20  nException();.. 
7eb0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7ec0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a  return result;..
7ed0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
7ee0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
7ef0: 2f 2f 2f 20 43 6f 6e 73 74 61 6e 74 73 20 77 69  /// Constants wi
7f00: 6c 6c 20 62 65 20 73 65 6e 64 20 74 6f 20 74 68  ll be send to th
7f10: 65 20 73 74 6f 72 65 20 61 73 20 70 61 72 74 20  e store as part 
7f20: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
7f30: 20 54 53 51 4c 2c 20 6e 6f 74 20 61 73 20 70 61   TSQL, not as pa
7f40: 72 61 6d 65 74 65 72 73 0d 0a 20 20 20 20 2f 2f  rameters..    //
7f50: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
7f60: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
7f70: 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  e="e"></param>..
7f80: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
7f90: 3e 41 20 3c 73 65 65 20 63 72 65 66 3d 22 53 71  >A <see cref="Sq
7fa0: 6c 42 75 69 6c 64 65 72 22 2f 3e 2e 20 20 53 74  lBuilder"/>.  St
7fb0: 72 69 6e 67 73 20 61 72 65 20 77 72 61 70 70 65  rings are wrappe
7fc0: 64 20 69 6e 20 73 69 6e 67 6c 65 0d 0a 20 20 20  d in single..   
7fd0: 20 2f 2f 2f 20 71 75 6f 74 65 73 20 61 6e 64 20   /// quotes and 
7fe0: 65 73 63 61 70 65 64 2e 20 20 4e 75 6d 62 65 72  escaped.  Number
7ff0: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6c 69  s are written li
8000: 74 65 72 61 6c 6c 79 2e 3c 2f 72 65 74 75 72 6e  terally.</return
8010: 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f  s>..    public o
8020: 76 65 72 72 69 64 65 20 49 53 71 6c 46 72 61 67  verride ISqlFrag
8030: 6d 65 6e 74 20 56 69 73 69 74 28 44 62 43 6f 6e  ment Visit(DbCon
8040: 73 74 61 6e 74 45 78 70 72 65 73 73 69 6f 6e 20  stantExpression 
8050: 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  e)..    {..     
8060: 20 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75   SqlBuilder resu
8070: 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c  lt = new SqlBuil
8080: 64 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  der();....      
8090: 50 72 69 6d 69 74 69 76 65 54 79 70 65 4b 69 6e  PrimitiveTypeKin
80a0: 64 20 74 79 70 65 4b 69 6e 64 3b 0d 0a 20 20 20  d typeKind;..   
80b0: 20 20 20 2f 2f 20 4d 6f 64 65 6c 20 54 79 70 65     // Model Type
80c0: 73 20 63 61 6e 20 62 65 20 28 61 74 20 74 68 65  s can be (at the
80d0: 20 74 69 6d 65 20 6f 66 20 74 68 69 73 20 69 6d   time of this im
80e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 3a 0d 0a  plementation):..
80f0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 42 69        //      Bi
8100: 6e 61 72 79 2c 20 42 6f 6f 6c 65 61 6e 2c 20 42  nary, Boolean, B
8110: 79 74 65 2c 20 44 61 74 65 54 69 6d 65 2c 20 44  yte, DateTime, D
8120: 65 63 69 6d 61 6c 2c 20 44 6f 75 62 6c 65 2c 20  ecimal, Double, 
8130: 47 75 69 64 2c 20 49 6e 74 31 36 2c 20 49 6e 74  Guid, Int16, Int
8140: 33 32 2c 20 49 6e 74 36 34 2c 53 69 6e 67 6c 65  32, Int64,Single
8150: 2c 20 53 74 72 69 6e 67 0d 0a 20 20 20 20 20 20  , String..      
8160: 69 66 20 28 4d 65 74 61 64 61 74 61 48 65 6c 70  if (MetadataHelp
8170: 65 72 73 2e 54 72 79 47 65 74 50 72 69 6d 69 74  ers.TryGetPrimit
8180: 69 76 65 54 79 70 65 4b 69 6e 64 28 65 2e 52 65  iveTypeKind(e.Re
8190: 73 75 6c 74 54 79 70 65 2c 20 6f 75 74 20 74 79  sultType, out ty
81a0: 70 65 4b 69 6e 64 29 29 0d 0a 20 20 20 20 20 20  peKind))..      
81b0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  {..        switc
81c0: 68 20 28 74 79 70 65 4b 69 6e 64 29 0d 0a 20 20  h (typeKind)..  
81d0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
81e0: 20 20 20 63 61 73 65 20 50 72 69 6d 69 74 69 76     case Primitiv
81f0: 65 54 79 70 65 4b 69 6e 64 2e 49 6e 74 33 32 3a  eTypeKind.Int32:
8200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
8210: 73 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e 56 61  sult.Append(e.Va
8220: 6c 75 65 2e 54 6f 53 74 72 69 6e 67 28 29 29 3b  lue.ToString());
8230: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ..            br
8240: 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  eak;....        
8250: 20 20 63 61 73 65 20 50 72 69 6d 69 74 69 76 65    case Primitive
8260: 54 79 70 65 4b 69 6e 64 2e 42 69 6e 61 72 79 3a  TypeKind.Binary:
8270: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  ..            To
8280: 42 6c 6f 62 4c 69 74 65 72 61 6c 28 28 62 79 74  BlobLiteral((byt
8290: 65 5b 5d 29 65 2e 56 61 6c 75 65 2c 20 72 65 73  e[])e.Value, res
82a0: 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ult);..         
82b0: 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20     break;....   
82c0: 20 20 20 20 20 20 20 63 61 73 65 20 50 72 69 6d         case Prim
82d0: 69 74 69 76 65 54 79 70 65 4b 69 6e 64 2e 42 6f  itiveTypeKind.Bo
82e0: 6f 6c 65 61 6e 3a 0d 0a 20 20 20 20 20 20 20 20  olean:..        
82f0: 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e      result.Appen
8300: 64 28 28 62 6f 6f 6c 29 65 2e 56 61 6c 75 65 20  d((bool)e.Value 
8310: 3f 20 22 31 22 20 3a 20 22 30 22 29 3b 0d 0a 20  ? "1" : "0");.. 
8320: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8330: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63  ;....          c
8340: 61 73 65 20 50 72 69 6d 69 74 69 76 65 54 79 70  ase PrimitiveTyp
8350: 65 4b 69 6e 64 2e 42 79 74 65 3a 0d 0a 20 20 20  eKind.Byte:..   
8360: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e           result.
8370: 41 70 70 65 6e 64 28 65 2e 56 61 6c 75 65 2e 54  Append(e.Value.T
8380: 6f 53 74 72 69 6e 67 28 29 29 3b 0d 0a 20 20 20  oString());..   
8390: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d           break;.
83a0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ...          cas
83b0: 65 20 50 72 69 6d 69 74 69 76 65 54 79 70 65 4b  e PrimitiveTypeK
83c0: 69 6e 64 2e 44 61 74 65 54 69 6d 65 3a 0d 0a 20  ind.DateTime:.. 
83d0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
83e0: 6e 65 65 64 51 75 6f 74 65 73 20 3d 20 4e 65 65  needQuotes = Nee
83f0: 64 53 69 6e 67 6c 65 51 75 6f 74 65 73 28 5f 6d  dSingleQuotes(_m
8400: 61 6e 69 66 65 73 74 2e 5f 64 61 74 65 54 69 6d  anifest._dateTim
8410: 65 46 6f 72 6d 61 74 29 3b 0d 0a 0d 0a 20 20 20  eFormat);....   
8420: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
8430: 64 61 74 65 53 74 72 69 6e 67 20 3d 20 53 51 4c  dateString = SQL
8440: 69 74 65 43 6f 6e 76 65 72 74 2e 54 6f 53 74 72  iteConvert.ToStr
8450: 69 6e 67 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ing(..          
8460: 20 20 20 20 20 20 28 53 79 73 74 65 6d 2e 44 61        (System.Da
8470: 74 65 54 69 6d 65 29 65 2e 56 61 6c 75 65 2c 20  teTime)e.Value, 
8480: 5f 6d 61 6e 69 66 65 73 74 2e 5f 64 61 74 65 54  _manifest._dateT
8490: 69 6d 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20  imeFormat,..    
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 5f 6d 61 6e              _man
84b0: 69 66 65 73 74 2e 5f 64 61 74 65 54 69 6d 65 4b  ifest._dateTimeK
84c0: 69 6e 64 2c 20 5f 6d 61 6e 69 66 65 73 74 2e 5f  ind, _manifest._
84d0: 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 53 74  dateTimeFormatSt
84e0: 72 69 6e 67 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ring);....      
84f0: 20 20 20 20 20 20 69 66 20 28 6e 65 65 64 51 75        if (needQu
8500: 6f 74 65 73 29 0d 0a 20 20 20 20 20 20 20 20 20  otes)..         
8510: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8520: 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
8530: 65 6e 64 28 45 73 63 61 70 65 53 69 6e 67 6c 65  end(EscapeSingle
8540: 51 75 6f 74 65 28 0d 0a 20 20 20 20 20 20 20 20  Quote(..        
8550: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 65              date
8560: 53 74 72 69 6e 67 2c 20 66 61 6c 73 65 20 2f 2a  String, false /*
8570: 20 49 73 55 6e 69 63 6f 64 65 20 2a 2f 29 29 3b   IsUnicode */));
8580: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
8590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
85a0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  e..            {
85b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
85c0: 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
85d0: 64 61 74 65 53 74 72 69 6e 67 29 3b 0d 0a 20 20  dateString);..  
85e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
85f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d           break;.
8600: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ...          cas
8610: 65 20 50 72 69 6d 69 74 69 76 65 54 79 70 65 4b  e PrimitiveTypeK
8620: 69 6e 64 2e 44 65 63 69 6d 61 6c 3a 0d 0a 20 20  ind.Decimal:..  
8630: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
8640: 20 73 74 72 44 65 63 69 6d 61 6c 20 3d 20 28 28   strDecimal = ((
8650: 44 65 63 69 6d 61 6c 29 65 2e 56 61 6c 75 65 29  Decimal)e.Value)
8660: 2e 54 6f 53 74 72 69 6e 67 28 43 75 6c 74 75 72  .ToString(Cultur
8670: 65 49 6e 66 6f 2e 49 6e 76 61 72 69 61 6e 74 43  eInfo.InvariantC
8680: 75 6c 74 75 72 65 29 3b 0d 0a 20 20 20 20 20 20  ulture);..      
8690: 20 20 20 20 20 20 2f 2f 20 69 66 20 74 68 65 20        // if the 
86a0: 64 65 63 69 6d 61 6c 20 76 61 6c 75 65 20 68 61  decimal value ha
86b0: 73 20 6e 6f 20 64 65 63 69 6d 61 6c 20 70 61 72  s no decimal par
86c0: 74 2c 20 63 61 73 74 20 61 73 20 64 65 63 69 6d  t, cast as decim
86d0: 61 6c 20 74 6f 20 70 72 65 73 65 72 76 65 20 74  al to preserve t
86e0: 79 70 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ype..           
86f0: 20 2f 2f 20 69 66 20 74 68 65 20 6e 75 6d 62 65   // if the numbe
8700: 72 20 68 61 73 20 70 72 65 63 69 73 69 6f 6e 20  r has precision 
8710: 3e 20 69 6e 74 36 34 20 6d 61 78 20 70 72 65 63  > int64 max prec
8720: 69 73 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ision, it will b
8730: 65 20 68 61 6e 64 6c 65 64 20 61 73 20 64 65 63  e handled as dec
8740: 69 6d 61 6c 20 62 79 20 73 71 6c 20 73 65 72 76  imal by sql serv
8750: 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
8760: 2f 2f 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  // and does not 
8770: 6e 65 65 64 20 63 61 73 74 2e 20 69 66 20 70 72  need cast. if pr
8780: 65 63 69 73 69 6f 6e 20 69 73 20 6c 65 73 74 20  ecision is lest 
8790: 74 68 65 6e 20 32 30 2c 20 74 68 65 6e 20 63 61  then 20, then ca
87a0: 73 74 20 75 73 69 6e 67 20 4d 61 78 28 6c 69 74  st using Max(lit
87b0: 65 72 61 6c 20 70 72 65 63 69 73 69 6f 6e 2c 20  eral precision, 
87c0: 73 71 6c 20 64 65 66 61 75 6c 74 20 70 72 65 63  sql default prec
87d0: 69 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20  ision)..        
87e0: 20 20 20 20 69 66 20 28 2d 31 20 3d 3d 20 73 74      if (-1 == st
87f0: 72 44 65 63 69 6d 61 6c 2e 49 6e 64 65 78 4f 66  rDecimal.IndexOf
8800: 28 27 2e 27 29 20 26 26 20 28 73 74 72 44 65 63  ('.') && (strDec
8810: 69 6d 61 6c 2e 54 72 69 6d 53 74 61 72 74 28 6e  imal.TrimStart(n
8820: 65 77 20 63 68 61 72 5b 5d 20 7b 20 27 2d 27 20  ew char[] { '-' 
8830: 7d 29 2e 4c 65 6e 67 74 68 20 3c 20 32 30 29 29  }).Length < 20))
8840: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
8850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
8860: 79 74 65 20 70 72 65 63 69 73 69 6f 6e 20 3d 20  yte precision = 
8870: 28 42 79 74 65 29 73 74 72 44 65 63 69 6d 61 6c  (Byte)strDecimal
8880: 2e 4c 65 6e 67 74 68 3b 0d 0a 20 20 20 20 20 20  .Length;..      
8890: 20 20 20 20 20 20 20 20 46 61 63 65 74 44 65 73          FacetDes
88a0: 63 72 69 70 74 69 6f 6e 20 70 72 65 63 69 73 69  cription precisi
88b0: 6f 6e 46 61 63 65 74 44 65 73 63 72 69 70 74 69  onFacetDescripti
88c0: 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on;..           
88d0: 20 20 20 44 65 62 75 67 2e 41 73 73 65 72 74 28     Debug.Assert(
88e0: 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e  MetadataHelpers.
88f0: 54 72 79 47 65 74 54 79 70 65 46 61 63 65 74 44  TryGetTypeFacetD
8900: 65 73 63 72 69 70 74 69 6f 6e 42 79 4e 61 6d 65  escriptionByName
8910: 28 65 2e 52 65 73 75 6c 74 54 79 70 65 2e 45 64  (e.ResultType.Ed
8920: 6d 54 79 70 65 2c 20 22 70 72 65 63 69 73 69 6f  mType, "precisio
8930: 6e 22 2c 20 6f 75 74 20 70 72 65 63 69 73 69 6f  n", out precisio
8940: 6e 46 61 63 65 74 44 65 73 63 72 69 70 74 69 6f  nFacetDescriptio
8950: 6e 29 2c 20 22 44 65 63 69 6d 61 6c 20 70 72 69  n), "Decimal pri
8960: 6d 69 74 69 76 65 20 74 79 70 65 20 6d 75 73 74  mitive type must
8970: 20 68 61 76 65 20 50 72 65 63 69 73 69 6f 6e 20   have Precision 
8980: 66 61 63 65 74 22 29 3b 0d 0a 20 20 20 20 20 20  facet");..      
8990: 20 20 20 20 20 20 20 20 69 66 20 28 4d 65 74 61          if (Meta
89a0: 64 61 74 61 48 65 6c 70 65 72 73 2e 54 72 79 47  dataHelpers.TryG
89b0: 65 74 54 79 70 65 46 61 63 65 74 44 65 73 63 72  etTypeFacetDescr
89c0: 69 70 74 69 6f 6e 42 79 4e 61 6d 65 28 65 2e 52  iptionByName(e.R
89d0: 65 73 75 6c 74 54 79 70 65 2e 45 64 6d 54 79 70  esultType.EdmTyp
89e0: 65 2c 20 22 70 72 65 63 69 73 69 6f 6e 22 2c 20  e, "precision", 
89f0: 6f 75 74 20 70 72 65 63 69 73 69 6f 6e 46 61 63  out precisionFac
8a00: 65 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 0d  etDescription)).
8a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
8a20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8a30: 20 20 69 66 20 28 70 72 65 63 69 73 69 6f 6e 46    if (precisionF
8a40: 61 63 65 74 44 65 73 63 72 69 70 74 69 6f 6e 2e  acetDescription.
8a50: 44 65 66 61 75 6c 74 56 61 6c 75 65 20 21 3d 20  DefaultValue != 
8a60: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
8a70: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 63              prec
8a90: 69 73 69 6f 6e 20 3d 20 4d 61 74 68 2e 4d 61 78  ision = Math.Max
8aa0: 28 70 72 65 63 69 73 69 6f 6e 2c 20 28 62 79 74  (precision, (byt
8ab0: 65 29 70 72 65 63 69 73 69 6f 6e 46 61 63 65 74  e)precisionFacet
8ac0: 44 65 73 63 72 69 70 74 69 6f 6e 2e 44 65 66 61  Description.Defa
8ad0: 75 6c 74 56 61 6c 75 65 29 3b 0d 0a 20 20 20 20  ultValue);..    
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 65                De
8b10: 62 75 67 2e 41 73 73 65 72 74 28 70 72 65 63 69  bug.Assert(preci
8b20: 73 69 6f 6e 20 3e 20 30 2c 20 22 50 72 65 63 69  sion > 0, "Preci
8b30: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 67 72 65  sion must be gre
8b40: 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 22 29  ater than zero")
8b50: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
8b60: 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 73   result.Append(s
8b70: 74 72 44 65 63 69 6d 61 6c 29 3b 0d 0a 20 20 20  trDecimal);..   
8b80: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
8b90: 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20          else..  
8ba0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
8bb0: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
8bc0: 74 2e 41 70 70 65 6e 64 28 73 74 72 44 65 63 69  t.Append(strDeci
8bd0: 6d 61 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  mal);..         
8be0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
8bf0: 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20    break;....    
8c00: 20 20 20 20 20 20 63 61 73 65 20 50 72 69 6d 69        case Primi
8c10: 74 69 76 65 54 79 70 65 4b 69 6e 64 2e 44 6f 75  tiveTypeKind.Dou
8c20: 62 6c 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  ble:..          
8c30: 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
8c40: 28 28 44 6f 75 62 6c 65 29 65 2e 56 61 6c 75 65  ((Double)e.Value
8c50: 29 2e 54 6f 53 74 72 69 6e 67 28 43 75 6c 74 75  ).ToString(Cultu
8c60: 72 65 49 6e 66 6f 2e 49 6e 76 61 72 69 61 6e 74  reInfo.Invariant
8c70: 43 75 6c 74 75 72 65 29 29 3b 0d 0a 20 20 20 20  Culture));..    
8c80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
8c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ..          case
8ca0: 20 50 72 69 6d 69 74 69 76 65 54 79 70 65 4b 69   PrimitiveTypeKi
8cb0: 6e 64 2e 47 75 69 64 3a 0d 0a 20 20 20 20 20 20  nd.Guid:..      
8cc0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
8cd0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
8ce0: 76 61 6c 75 65 20 3d 20 65 2e 56 61 6c 75 65 3b  value = e.Value;
8cf0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
8d00: 20 20 20 20 69 66 20 28 5f 6d 61 6e 69 66 65 73      if (_manifes
8d10: 74 2e 5f 62 69 6e 61 72 79 47 75 69 64 20 26 26  t._binaryGuid &&
8d20: 20 28 76 61 6c 75 65 20 69 73 20 47 75 69 64 29   (value is Guid)
8d30: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8d40: 20 20 20 20 20 20 20 54 6f 42 6c 6f 62 4c 69 74         ToBlobLit
8d50: 65 72 61 6c 28 28 28 47 75 69 64 29 76 61 6c 75  eral(((Guid)valu
8d60: 65 29 2e 54 6f 42 79 74 65 41 72 72 61 79 28 29  e).ToByteArray()
8d70: 2c 20 72 65 73 75 6c 74 29 3b 0d 0a 20 20 20 20  , result);..    
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
8d90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8da0: 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
8db0: 65 6e 64 28 45 73 63 61 70 65 53 69 6e 67 6c 65  end(EscapeSingle
8dc0: 51 75 6f 74 65 28 65 2e 56 61 6c 75 65 2e 54 6f  Quote(e.Value.To
8dd0: 53 74 72 69 6e 67 28 29 2c 20 66 61 6c 73 65 20  String(), false 
8de0: 2f 2a 20 49 73 55 6e 69 63 6f 64 65 20 2a 2f 29  /* IsUnicode */)
8df0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
8e00: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  }..            b
8e10: 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  reak;....       
8e20: 20 20 20 63 61 73 65 20 50 72 69 6d 69 74 69 76     case Primitiv
8e30: 65 54 79 70 65 4b 69 6e 64 2e 49 6e 74 31 36 3a  eTypeKind.Int16:
8e40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
8e50: 73 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e 56 61  sult.Append(e.Va
8e60: 6c 75 65 2e 54 6f 53 74 72 69 6e 67 28 29 29 3b  lue.ToString());
8e70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ..            br
8e80: 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  eak;....        
8e90: 20 20 63 61 73 65 20 50 72 69 6d 69 74 69 76 65    case Primitive
8ea0: 54 79 70 65 4b 69 6e 64 2e 49 6e 74 36 34 3a 0d  TypeKind.Int64:.
8eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  .            res
8ec0: 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e 56 61 6c  ult.Append(e.Val
8ed0: 75 65 2e 54 6f 53 74 72 69 6e 67 28 29 29 3b 0d  ue.ToString());.
8ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
8ef0: 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ak;....         
8f00: 20 63 61 73 65 20 50 72 69 6d 69 74 69 76 65 54   case PrimitiveT
8f10: 79 70 65 4b 69 6e 64 2e 53 69 6e 67 6c 65 3a 0d  ypeKind.Single:.
8f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  .            res
8f30: 75 6c 74 2e 41 70 70 65 6e 64 28 28 28 53 69 6e  ult.Append(((Sin
8f40: 67 6c 65 29 65 2e 56 61 6c 75 65 29 2e 54 6f 53  gle)e.Value).ToS
8f50: 74 72 69 6e 67 28 43 75 6c 74 75 72 65 49 6e 66  tring(CultureInf
8f60: 6f 2e 49 6e 76 61 72 69 61 6e 74 43 75 6c 74 75  o.InvariantCultu
8f70: 72 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  re));..         
8f80: 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20     break;....   
8f90: 20 20 20 20 20 20 20 63 61 73 65 20 50 72 69 6d         case Prim
8fa0: 69 74 69 76 65 54 79 70 65 4b 69 6e 64 2e 53 74  itiveTypeKind.St
8fb0: 72 69 6e 67 3a 0d 0a 20 20 20 20 20 20 20 20 20  ring:..         
8fc0: 20 20 20 62 6f 6f 6c 20 69 73 55 6e 69 63 6f 64     bool isUnicod
8fd0: 65 20 3d 20 4d 65 74 61 64 61 74 61 48 65 6c 70  e = MetadataHelp
8fe0: 65 72 73 2e 47 65 74 46 61 63 65 74 56 61 6c 75  ers.GetFacetValu
8ff0: 65 4f 72 44 65 66 61 75 6c 74 3c 62 6f 6f 6c 3e  eOrDefault<bool>
9000: 28 65 2e 52 65 73 75 6c 74 54 79 70 65 2c 20 4d  (e.ResultType, M
9010: 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e 55  etadataHelpers.U
9020: 6e 69 63 6f 64 65 46 61 63 65 74 4e 61 6d 65 2c  nicodeFacetName,
9030: 20 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 20   true);..       
9040: 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
9050: 6e 64 28 45 73 63 61 70 65 53 69 6e 67 6c 65 51  nd(EscapeSingleQ
9060: 75 6f 74 65 28 65 2e 56 61 6c 75 65 20 61 73 20  uote(e.Value as 
9070: 73 74 72 69 6e 67 2c 20 69 73 55 6e 69 63 6f 64  string, isUnicod
9080: 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  e));..          
9090: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
90a0: 20 20 20 20 63 61 73 65 20 50 72 69 6d 69 74 69      case Primiti
90b0: 76 65 54 79 70 65 4b 69 6e 64 2e 44 61 74 65 54  veTypeKind.DateT
90c0: 69 6d 65 4f 66 66 73 65 74 3a 0d 0a 20 20 20 20  imeOffset:..    
90d0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
90e0: 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64 45 78  w NotSupportedEx
90f0: 63 65 70 74 69 6f 6e 28 22 64 61 74 65 74 69 6d  ception("datetim
9100: 65 6f 66 66 73 65 74 22 29 3b 0d 0a 20 20 20 20  eoffset");..    
9110: 20 20 20 20 20 20 63 61 73 65 20 50 72 69 6d 69        case Primi
9120: 74 69 76 65 54 79 70 65 4b 69 6e 64 2e 54 69 6d  tiveTypeKind.Tim
9130: 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e:..            
9140: 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74 53 75 70  throw new NotSup
9150: 70 6f 72 74 65 64 45 78 63 65 70 74 69 6f 6e 28  portedException(
9160: 22 74 69 6d 65 22 29 3b 0d 0a 20 20 20 20 20 20  "time");..      
9170: 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20      default:..  
9180: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 6c 6c            // all
9190: 20 6b 6e 6f 77 6e 20 73 63 61 6c 61 72 20 74 79   known scalar ty
91a0: 70 65 73 20 73 68 6f 75 6c 64 20 62 65 65 6e 20  pes should been 
91b0: 68 61 6e 64 6c 65 64 20 61 6c 72 65 61 64 79 2e  handled already.
91c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  ..            th
91d0: 72 6f 77 20 6e 65 77 20 4e 6f 74 53 75 70 70 6f  row new NotSuppo
91e0: 72 74 65 64 45 78 63 65 70 74 69 6f 6e 28 29 3b  rtedException();
91f0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9200: 20 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65     }..      else
9210: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
9220: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74     throw new Not
9230: 53 75 70 70 6f 72 74 65 64 45 78 63 65 70 74 69  SupportedExcepti
9240: 6f 6e 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  on();..      }..
9250: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ..      return r
9260: 65 73 75 6c 74 3b 0d 0a 0d 0a 20 20 20 20 7d 0d  esult;....    }.
9270: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
9280: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  ary>..    /// <s
9290: 65 65 20 63 72 65 66 3d 22 44 62 44 65 72 65 66  ee cref="DbDeref
92a0: 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e 20 69 73  Expression"/> is
92b0: 20 69 6c 6c 65 67 61 6c 20 61 74 20 74 68 69 73   illegal at this
92c0: 20 73 74 61 67 65 0d 0a 20 20 20 20 2f 2f 2f 20   stage..    /// 
92d0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
92e0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
92f0: 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  "e"></param>..  
9300: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c    /// <returns><
9310: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70  /returns>..    p
9320: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49  ublic override I
9330: 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69  SqlFragment Visi
9340: 74 28 44 62 44 65 72 65 66 45 78 70 72 65 73 73  t(DbDerefExpress
9350: 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20  ion e)..    {.. 
9360: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e       throw new N
9370: 6f 74 53 75 70 70 6f 72 74 65 64 45 78 63 65 70  otSupportedExcep
9380: 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a  tion();..    }..
9390: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
93a0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65  ry>..    /// The
93b0: 20 44 49 53 54 49 4e 43 54 20 68 61 73 20 74 6f   DISTINCT has to
93c0: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
93d0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 53 71   beginning of Sq
93e0: 6c 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74  lSelectStatement
93f0: 2e 53 65 6c 65 63 74 2c 0d 0a 20 20 20 20 2f 2f  .Select,..    //
9400: 2f 20 62 75 74 20 69 74 20 6d 69 67 68 74 20 62  / but it might b
9410: 65 20 74 6f 6f 20 6c 61 74 65 20 66 6f 72 20 74  e too late for t
9420: 68 61 74 2e 20 20 53 6f 2c 20 77 65 20 75 73 65  hat.  So, we use
9430: 20 61 20 66 6c 61 67 20 6f 6e 20 53 71 6c 53 65   a flag on SqlSe
9440: 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 0d 0a 20  lectStatement.. 
9450: 20 20 20 2f 2f 2f 20 69 6e 73 74 65 61 64 2c 20     /// instead, 
9460: 61 6e 64 20 61 64 64 20 74 68 65 20 22 44 49 53  and add the "DIS
9470: 54 49 4e 43 54 22 20 69 6e 20 74 68 65 20 73 65  TINCT" in the se
9480: 63 6f 6e 64 20 70 68 61 73 65 2e 0d 0a 20 20 20  cond phase...   
9490: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
94a0: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
94b0: 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d  name="e"></param
94c0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
94d0: 72 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d  rns>A <see cref=
94e0: 22 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d  "SqlSelectStatem
94f0: 65 6e 74 22 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e  ent"/></returns>
9500: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  ..    public ove
9510: 72 72 69 64 65 20 49 53 71 6c 46 72 61 67 6d 65  rride ISqlFragme
9520: 6e 74 20 56 69 73 69 74 28 44 62 44 69 73 74 69  nt Visit(DbDisti
9530: 6e 63 74 45 78 70 72 65 73 73 69 6f 6e 20 65 29  nctExpression e)
9540: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53  ..    {..      S
9550: 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e  qlSelectStatemen
9560: 74 20 72 65 73 75 6c 74 20 3d 20 56 69 73 69 74  t result = Visit
9570: 45 78 70 72 65 73 73 69 6f 6e 45 6e 73 75 72 65  ExpressionEnsure
9580: 53 71 6c 53 74 61 74 65 6d 65 6e 74 28 65 2e 41  SqlStatement(e.A
9590: 72 67 75 6d 65 6e 74 29 3b 0d 0a 0d 0a 20 20 20  rgument);....   
95a0: 20 20 20 69 66 20 28 21 49 73 43 6f 6d 70 61 74     if (!IsCompat
95b0: 69 62 6c 65 28 72 65 73 75 6c 74 2c 20 65 2e 45  ible(result, e.E
95c0: 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 29 29 0d  xpressionKind)).
95d0: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
95e0: 20 20 53 79 6d 62 6f 6c 20 66 72 6f 6d 53 79 6d    Symbol fromSym
95f0: 62 6f 6c 3b 0d 0a 20 20 20 20 20 20 20 20 54 79  bol;..        Ty
9600: 70 65 55 73 61 67 65 20 69 6e 70 75 74 54 79 70  peUsage inputTyp
9610: 65 20 3d 20 4d 65 74 61 64 61 74 61 48 65 6c 70  e = MetadataHelp
9620: 65 72 73 2e 47 65 74 45 6c 65 6d 65 6e 74 54 79  ers.GetElementTy
9630: 70 65 55 73 61 67 65 28 65 2e 41 72 67 75 6d 65  peUsage(e.Argume
9640: 6e 74 2e 52 65 73 75 6c 74 54 79 70 65 29 3b 0d  nt.ResultType);.
9650: 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
9660: 3d 20 43 72 65 61 74 65 4e 65 77 53 65 6c 65 63  = CreateNewSelec
9670: 74 53 74 61 74 65 6d 65 6e 74 28 72 65 73 75 6c  tStatement(resul
9680: 74 2c 20 22 44 49 53 54 49 4e 43 54 22 2c 20 69  t, "DISTINCT", i
9690: 6e 70 75 74 54 79 70 65 2c 20 6f 75 74 20 66 72  nputType, out fr
96a0: 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20  omSymbol);..    
96b0: 20 20 20 20 41 64 64 46 72 6f 6d 53 79 6d 62 6f      AddFromSymbo
96c0: 6c 28 72 65 73 75 6c 74 2c 20 22 44 49 53 54 49  l(result, "DISTI
96d0: 4e 43 54 22 2c 20 66 72 6f 6d 53 79 6d 62 6f 6c  NCT", fromSymbol
96e0: 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20  , false);..     
96f0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 75   }....      resu
9700: 6c 74 2e 49 73 44 69 73 74 69 6e 63 74 20 3d 20  lt.IsDistinct = 
9710: 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 72 65 74  true;..      ret
9720: 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20  urn result;..   
9730: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
9740: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
9750: 20 41 6e 20 65 6c 65 6d 65 6e 74 20 65 78 70 72   An element expr
9760: 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  ession returns a
9770: 20 73 63 61 6c 61 72 20 2d 20 73 6f 20 69 74 20   scalar - so it 
9780: 69 73 20 74 72 61 6e 73 6c 61 74 65 64 20 74 6f  is translated to
9790: 0d 0a 20 20 20 20 2f 2f 2f 20 28 20 53 65 6c 65  ..    /// ( Sele
97a0: 63 74 20 2e 2e 2e 20 29 0d 0a 20 20 20 20 2f 2f  ct ... )..    //
97b0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
97c0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
97d0: 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  e="e"></param>..
97e0: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
97f0: 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  ></returns>..   
9800: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
9810: 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69   ISqlFragment Vi
9820: 73 69 74 28 44 62 45 6c 65 6d 65 6e 74 45 78 70  sit(DbElementExp
9830: 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ression e)..    
9840: 7b 0d 0a 20 20 20 20 20 20 53 71 6c 42 75 69 6c  {..      SqlBuil
9850: 64 65 72 20 72 65 73 75 6c 74 20 3d 20 6e 65 77  der result = new
9860: 20 53 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d 0a   SqlBuilder();..
9870: 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
9880: 65 6e 64 28 22 28 22 29 3b 0d 0a 20 20 20 20 20  end("(");..     
9890: 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 56   result.Append(V
98a0: 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 45 6e  isitExpressionEn
98b0: 73 75 72 65 53 71 6c 53 74 61 74 65 6d 65 6e 74  sureSqlStatement
98c0: 28 65 2e 41 72 67 75 6d 65 6e 74 29 29 3b 0d 0a  (e.Argument));..
98d0: 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
98e0: 65 6e 64 28 22 29 22 29 3b 0d 0a 0d 0a 20 20 20  end(")");....   
98f0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
9900: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
9910: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
9920: 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66     /// <see cref
9930: 3d 22 56 69 73 69 74 28 44 62 55 6e 69 6f 6e 41  ="Visit(DbUnionA
9940: 6c 6c 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e  llExpression)"/>
9950: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
9960: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ary>..    /// <p
9970: 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f  aram name="e"></
9980: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
9990: 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72  <returns></retur
99a0: 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20  ns>..    public 
99b0: 6f 76 65 72 72 69 64 65 20 49 53 71 6c 46 72 61  override ISqlFra
99c0: 67 6d 65 6e 74 20 56 69 73 69 74 28 44 62 45 78  gment Visit(DbEx
99d0: 63 65 70 74 45 78 70 72 65 73 73 69 6f 6e 20 65  ceptExpression e
99e0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
99f0: 72 65 74 75 72 6e 20 56 69 73 69 74 53 65 74 4f  return VisitSetO
9a00: 70 45 78 70 72 65 73 73 69 6f 6e 28 65 2e 4c 65  pExpression(e.Le
9a10: 66 74 2c 20 65 2e 52 69 67 68 74 2c 20 22 45 58  ft, e.Right, "EX
9a20: 43 45 50 54 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a  CEPT");..    }..
9a30: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
9a40: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4f 6e 6c  ry>..    /// Onl
9a50: 79 20 63 6f 6e 63 72 65 74 65 20 65 78 70 72 65  y concrete expre
9a60: 73 73 69 6f 6e 20 74 79 70 65 73 20 77 69 6c 6c  ssion types will
9a70: 20 62 65 20 76 69 73 69 74 65 64 2e 0d 0a 20 20   be visited...  
9a80: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
9a90: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
9aa0: 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61   name="e"></para
9ab0: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
9ac0: 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d  urns></returns>.
9ad0: 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
9ae0: 72 69 64 65 20 49 53 71 6c 46 72 61 67 6d 65 6e  ride ISqlFragmen
9af0: 74 20 56 69 73 69 74 28 44 62 45 78 70 72 65 73  t Visit(DbExpres
9b00: 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a  sion e)..    {..
9b10: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
9b20: 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f 6e  InvalidOperation
9b30: 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20  Exception();..  
9b40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
9b50: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
9b60: 2f 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  /..    /// </sum
9b70: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
9b80: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c  param name="e"><
9b90: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
9ba0: 20 3c 72 65 74 75 72 6e 73 3e 49 66 20 77 65 20   <returns>If we 
9bb0: 61 72 65 20 69 6e 20 61 20 4a 6f 69 6e 20 63 6f  are in a Join co
9bc0: 6e 74 65 78 74 2c 20 72 65 74 75 72 6e 73 20 61  ntext, returns a
9bd0: 20 3c 73 65 65 20 63 72 65 66 3d 22 53 71 6c 42   <see cref="SqlB
9be0: 75 69 6c 64 65 72 22 2f 3e 0d 0a 20 20 20 20 2f  uilder"/>..    /
9bf0: 2f 2f 20 77 69 74 68 20 74 68 65 20 65 78 74 65  // with the exte
9c00: 6e 74 20 6e 61 6d 65 2c 20 6f 74 68 65 72 77 69  nt name, otherwi
9c10: 73 65 2c 20 61 20 6e 65 77 20 3c 73 65 65 20 63  se, a new <see c
9c20: 72 65 66 3d 22 53 71 6c 53 65 6c 65 63 74 53 74  ref="SqlSelectSt
9c30: 61 74 65 6d 65 6e 74 22 2f 3e 0d 0a 20 20 20 20  atement"/>..    
9c40: 2f 2f 2f 20 77 69 74 68 20 74 68 65 20 46 72 6f  /// with the Fro
9c50: 6d 20 66 69 65 6c 64 20 73 65 74 2e 3c 2f 72 65  m field set.</re
9c60: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c  turns>..    publ
9c70: 69 63 20 6f 76 65 72 72 69 64 65 20 49 53 71 6c  ic override ISql
9c80: 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74 28 44  Fragment Visit(D
9c90: 62 53 63 61 6e 45 78 70 72 65 73 73 69 6f 6e 20  bScanExpression 
9ca0: 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  e)..    {..     
9cb0: 20 45 6e 74 69 74 79 53 65 74 42 61 73 65 20 74   EntitySetBase t
9cc0: 61 72 67 65 74 20 3d 20 65 2e 54 61 72 67 65 74  arget = e.Target
9cd0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 49  ;....      if (I
9ce0: 73 50 61 72 65 6e 74 41 4a 6f 69 6e 29 0d 0a 20  sParentAJoin).. 
9cf0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
9d00: 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c  SqlBuilder resul
9d10: 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64  t = new SqlBuild
9d20: 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 72  er();..        r
9d30: 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 47 65 74  esult.Append(Get
9d40: 54 61 72 67 65 74 54 53 71 6c 28 74 61 72 67 65  TargetTSql(targe
9d50: 74 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  t));....        
9d60: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a  return result;..
9d70: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 65        }..      e
9d80: 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  lse..      {..  
9d90: 20 20 20 20 20 20 53 71 6c 53 65 6c 65 63 74 53        SqlSelectS
9da0: 74 61 74 65 6d 65 6e 74 20 72 65 73 75 6c 74 20  tatement result 
9db0: 3d 20 6e 65 77 20 53 71 6c 53 65 6c 65 63 74 53  = new SqlSelectS
9dc0: 74 61 74 65 6d 65 6e 74 28 29 3b 0d 0a 20 20 20  tatement();..   
9dd0: 20 20 20 20 20 72 65 73 75 6c 74 2e 46 72 6f 6d       result.From
9de0: 2e 41 70 70 65 6e 64 28 47 65 74 54 61 72 67 65  .Append(GetTarge
9df0: 74 54 53 71 6c 28 74 61 72 67 65 74 29 29 3b 0d  tTSql(target));.
9e00: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
9e10: 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 20  n result;..     
9e20: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 0d 0a 20   }..    }...... 
9e30: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
9e40: 0d 0a 20 20 20 20 2f 2f 2f 20 47 65 74 73 20 65  ..    /// Gets e
9e50: 73 63 61 70 65 64 20 54 53 71 6c 20 69 64 65 6e  scaped TSql iden
9e60: 74 69 66 69 65 72 20 64 65 73 63 72 69 62 69 6e  tifier describin
9e70: 67 20 74 68 69 73 20 65 6e 74 69 74 79 20 73 65  g this entity se
9e80: 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  t...    /// </su
9e90: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
9ea0: 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72  <returns></retur
9eb0: 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  ns>..    interna
9ec0: 6c 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  l static string 
9ed0: 47 65 74 54 61 72 67 65 74 54 53 71 6c 28 45 6e  GetTargetTSql(En
9ee0: 74 69 74 79 53 65 74 42 61 73 65 20 65 6e 74 69  titySetBase enti
9ef0: 74 79 53 65 74 42 61 73 65 29 0d 0a 20 20 20 20  tySetBase)..    
9f00: 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 63 6f 6e 73  {..      // cons
9f10: 74 72 75 63 74 20 65 73 63 61 70 65 64 20 54 2d  truct escaped T-
9f20: 53 51 4c 20 72 65 66 65 72 65 6e 63 69 6e 67 20  SQL referencing 
9f30: 65 6e 74 69 74 79 20 73 65 74 0d 0a 20 20 20 20  entity set..    
9f40: 20 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20    StringBuilder 
9f50: 62 75 69 6c 64 65 72 20 3d 20 6e 65 77 20 53 74  builder = new St
9f60: 72 69 6e 67 42 75 69 6c 64 65 72 28 35 30 29 3b  ringBuilder(50);
9f70: 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 64  ..      string d
9f80: 65 66 69 6e 69 6e 67 51 75 65 72 79 20 3d 20 4d  efiningQuery = M
9f90: 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e 54  etadataHelpers.T
9fa0: 72 79 47 65 74 56 61 6c 75 65 46 6f 72 4d 65 74  ryGetValueForMet
9fb0: 61 64 61 74 61 50 72 6f 70 65 72 74 79 3c 73 74  adataProperty<st
9fc0: 72 69 6e 67 3e 28 65 6e 74 69 74 79 53 65 74 42  ring>(entitySetB
9fd0: 61 73 65 2c 20 22 44 65 66 69 6e 69 6e 67 51 75  ase, "DefiningQu
9fe0: 65 72 79 22 29 3b 0d 0a 20 20 20 20 20 20 69 66  ery");..      if
9ff0: 20 28 21 73 74 72 69 6e 67 2e 49 73 4e 75 6c 6c   (!string.IsNull
a000: 4f 72 45 6d 70 74 79 28 64 65 66 69 6e 69 6e 67  OrEmpty(defining
a010: 51 75 65 72 79 29 29 0d 0a 20 20 20 20 20 20 7b  Query))..      {
a020: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 64 65 66 69  ..        //defi
a030: 6e 69 6e 67 51 75 65 72 79 20 3d 20 64 65 66 69  ningQuery = defi
a040: 6e 69 6e 67 51 75 65 72 79 2e 54 72 69 6d 53 74  ningQuery.TrimSt
a050: 61 72 74 28 27 20 27 2c 20 27 5c 74 27 2c 20 27  art(' ', '\t', '
a060: 5c 72 27 2c 20 27 5c 6e 27 29 3b 0d 0a 20 20 20  \r', '\n');..   
a070: 20 20 20 20 20 2f 2f 69 66 20 28 53 74 72 69 6e       //if (Strin
a080: 67 2e 43 6f 6d 70 61 72 65 28 64 65 66 69 6e 69  g.Compare(defini
a090: 6e 67 51 75 65 72 79 2c 20 30 2c 20 22 54 59 50  ngQuery, 0, "TYP
a0a0: 45 53 20 22 2c 20 30 2c 20 36 2c 20 53 74 72 69  ES ", 0, 6, Stri
a0b0: 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64  ngComparison.Ord
a0c0: 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20  inalIgnoreCase) 
a0d0: 3d 3d 20 30 29 0d 0a 20 20 20 20 20 20 20 20 2f  == 0)..        /
a0e0: 2f 20 20 64 65 66 69 6e 69 6e 67 51 75 65 72 79  /  definingQuery
a0f0: 20 3d 20 64 65 66 69 6e 69 6e 67 51 75 65 72 79   = definingQuery
a100: 2e 53 75 62 73 74 72 69 6e 67 28 64 65 66 69 6e  .Substring(defin
a110: 69 6e 67 51 75 65 72 79 2e 49 6e 64 65 78 4f 66  ingQuery.IndexOf
a120: 28 27 3b 27 29 20 2b 20 31 29 2e 54 72 69 6d 53  (';') + 1).TrimS
a130: 74 61 72 74 28 27 20 27 2c 20 27 5c 74 27 2c 20  tart(' ', '\t', 
a140: 27 5c 72 27 2c 20 27 5c 6e 27 29 3b 0d 0a 20 20  '\r', '\n');..  
a150: 20 20 20 20 20 20 62 75 69 6c 64 65 72 2e 41 70        builder.Ap
a160: 70 65 6e 64 28 22 28 22 29 3b 0d 0a 20 20 20 20  pend("(");..    
a170: 20 20 20 20 62 75 69 6c 64 65 72 2e 41 70 70 65      builder.Appe
a180: 6e 64 28 64 65 66 69 6e 69 6e 67 51 75 65 72 79  nd(definingQuery
a190: 29 3b 0d 0a 20 20 20 20 20 20 20 20 62 75 69 6c  );..        buil
a1a0: 64 65 72 2e 41 70 70 65 6e 64 28 22 29 22 29 3b  der.Append(")");
a1b0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
a1c0: 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a   else..      {..
a1d0: 20 20 20 20 20 20 20 20 2f 2f 73 74 72 69 6e 67          //string
a1e0: 20 73 63 68 65 6d 61 4e 61 6d 65 20 3d 20 4d 65   schemaName = Me
a1f0: 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e 54 72  tadataHelpers.Tr
a200: 79 47 65 74 56 61 6c 75 65 46 6f 72 4d 65 74 61  yGetValueForMeta
a210: 64 61 74 61 50 72 6f 70 65 72 74 79 3c 73 74 72  dataProperty<str
a220: 69 6e 67 3e 28 65 6e 74 69 74 79 53 65 74 42 61  ing>(entitySetBa
a230: 73 65 2c 20 22 53 63 68 65 6d 61 22 29 3b 0d 0a  se, "Schema");..
a240: 20 20 20 20 20 20 20 20 2f 2f 69 66 20 28 21 73          //if (!s
a250: 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d  tring.IsNullOrEm
a260: 70 74 79 28 73 63 68 65 6d 61 4e 61 6d 65 29 29  pty(schemaName))
a270: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 7b 0d 0a 20  ..        //{.. 
a280: 20 20 20 20 20 20 20 2f 2f 20 20 62 75 69 6c 64         //  build
a290: 65 72 2e 41 70 70 65 6e 64 28 53 71 6c 47 65 6e  er.Append(SqlGen
a2a0: 65 72 61 74 6f 72 2e 51 75 6f 74 65 49 64 65 6e  erator.QuoteIden
a2b0: 74 69 66 69 65 72 28 73 63 68 65 6d 61 4e 61 6d  tifier(schemaNam
a2c0: 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  e));..        //
a2d0: 20 20 62 75 69 6c 64 65 72 2e 41 70 70 65 6e 64    builder.Append
a2e0: 28 22 2e 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  (".");..        
a2f0: 2f 2f 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  //}....        s
a300: 74 72 69 6e 67 20 74 61 62 6c 65 4e 61 6d 65 20  tring tableName 
a310: 3d 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72  = MetadataHelper
a320: 73 2e 54 72 79 47 65 74 56 61 6c 75 65 46 6f 72  s.TryGetValueFor
a330: 4d 65 74 61 64 61 74 61 50 72 6f 70 65 72 74 79  MetadataProperty
a340: 3c 73 74 72 69 6e 67 3e 28 65 6e 74 69 74 79 53  <string>(entityS
a350: 65 74 42 61 73 65 2c 20 22 54 61 62 6c 65 22 29  etBase, "Table")
a360: 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 21  ;..        if (!
a370: 73 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45  string.IsNullOrE
a380: 6d 70 74 79 28 74 61 62 6c 65 4e 61 6d 65 29 29  mpty(tableName))
a390: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
a3a0: 20 20 20 20 20 20 20 62 75 69 6c 64 65 72 2e 41         builder.A
a3b0: 70 70 65 6e 64 28 53 71 6c 47 65 6e 65 72 61 74  ppend(SqlGenerat
a3c0: 6f 72 2e 51 75 6f 74 65 49 64 65 6e 74 69 66 69  or.QuoteIdentifi
a3d0: 65 72 28 74 61 62 6c 65 4e 61 6d 65 29 29 3b 0d  er(tableName));.
a3e0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
a3f0: 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
a400: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62    {..          b
a410: 75 69 6c 64 65 72 2e 41 70 70 65 6e 64 28 53 71  uilder.Append(Sq
a420: 6c 47 65 6e 65 72 61 74 6f 72 2e 51 75 6f 74 65  lGenerator.Quote
a430: 49 64 65 6e 74 69 66 69 65 72 28 65 6e 74 69 74  Identifier(entit
a440: 79 53 65 74 42 61 73 65 2e 4e 61 6d 65 29 29 3b  ySetBase.Name));
a450: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
a460: 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75     }..      retu
a470: 72 6e 20 62 75 69 6c 64 65 72 2e 54 6f 53 74 72  rn builder.ToStr
a480: 69 6e 67 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  ing();..    }...
a490: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
a4a0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  y>..    /// The 
a4b0: 62 6f 64 69 65 73 20 6f 66 20 3c 73 65 65 20 63  bodies of <see c
a4c0: 72 65 66 3d 22 56 69 73 69 74 28 44 62 46 69 6c  ref="Visit(DbFil
a4d0: 74 65 72 45 78 70 72 65 73 73 69 6f 6e 29 22 2f  terExpression)"/
a4e0: 3e 2c 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69  >, <see cref="Vi
a4f0: 73 69 74 28 44 62 47 72 6f 75 70 42 79 45 78 70  sit(DbGroupByExp
a500: 72 65 73 73 69 6f 6e 29 22 2f 3e 2c 0d 0a 20 20  ression)"/>,..  
a510: 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
a520: 22 56 69 73 69 74 28 44 62 50 72 6f 6a 65 63 74  "Visit(DbProject
a530: 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e 2c 20  Expression)"/>, 
a540: 3c 73 65 65 20 63 72 65 66 3d 22 56 69 73 69 74  <see cref="Visit
a550: 28 44 62 53 6f 72 74 45 78 70 72 65 73 73 69 6f  (DbSortExpressio
a560: 6e 29 22 2f 3e 20 61 72 65 20 73 69 6d 69 6c 61  n)"/> are simila
a570: 72 2e 0d 0a 20 20 20 20 2f 2f 2f 20 45 61 63 68  r...    /// Each
a580: 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77   does the follow
a590: 69 6e 67 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 6c  ing...    /// <l
a5a0: 69 73 74 20 74 79 70 65 3d 22 6e 75 6d 62 65 72  ist type="number
a5b0: 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 69 74 65  ">..    /// <ite
a5c0: 6d 3e 20 56 69 73 69 74 20 74 68 65 20 69 6e 70  m> Visit the inp
a5d0: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 3c 2f 69  ut expression</i
a5e0: 74 65 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 69  tem>..    /// <i
a5f0: 74 65 6d 3e 20 44 65 74 65 72 6d 69 6e 65 20 69  tem> Determine i
a600: 66 20 74 68 65 20 69 6e 70 75 74 27 73 20 53 51  f the input's SQ
a610: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20  L statement can 
a620: 62 65 20 72 65 75 73 65 64 2c 20 6f 72 20 61 20  be reused, or a 
a630: 6e 65 77 0d 0a 20 20 20 20 2f 2f 2f 20 6f 6e 65  new..    /// one
a640: 20 6d 75 73 74 20 62 65 20 63 72 65 61 74 65 64   must be created
a650: 2e 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f 2f  .</item>..    //
a660: 2f 20 3c 69 74 65 6d 3e 43 72 65 61 74 65 20 61  / <item>Create a
a670: 20 6e 65 77 20 73 79 6d 62 6f 6c 20 74 61 62 6c   new symbol tabl
a680: 65 20 73 63 6f 70 65 3c 2f 69 74 65 6d 3e 0d 0a  e scope</item>..
a690: 20 20 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 50 75      /// <item>Pu
a6a0: 73 68 20 74 68 65 20 53 71 6c 20 73 74 61 74 65  sh the Sql state
a6b0: 6d 65 6e 74 20 6f 6e 74 6f 20 61 20 73 74 61 63  ment onto a stac
a6c0: 6b 2c 20 73 6f 20 74 68 61 74 20 63 68 69 6c 64  k, so that child
a6d0: 72 65 6e 20 63 61 6e 0d 0a 20 20 20 20 2f 2f 2f  ren can..    ///
a6e0: 20 75 70 64 61 74 65 20 74 68 65 20 66 72 65 65   update the free
a6f0: 20 76 61 72 69 61 62 6c 65 20 6c 69 73 74 2e 3c   variable list.<
a700: 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  /item>..    /// 
a710: 3c 69 74 65 6d 3e 56 69 73 69 74 20 74 68 65 20  <item>Visit the 
a720: 6e 6f 6e 2d 69 6e 70 75 74 20 65 78 70 72 65 73  non-input expres
a730: 73 69 6f 6e 2e 3c 2f 69 74 65 6d 3e 0d 0a 20 20  sion.</item>..  
a740: 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 43 6c 65 61    /// <item>Clea
a750: 6e 75 70 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20  nup</item>..    
a760: 2f 2f 2f 20 3c 2f 6c 69 73 74 3e 0d 0a 20 20 20  /// </list>..   
a770: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
a780: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
a790: 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d  name="e"></param
a7a0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
a7b0: 72 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d  rns>A <see cref=
a7c0: 22 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d  "SqlSelectStatem
a7d0: 65 6e 74 22 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e  ent"/></returns>
a7e0: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  ..    public ove
a7f0: 72 72 69 64 65 20 49 53 71 6c 46 72 61 67 6d 65  rride ISqlFragme
a800: 6e 74 20 56 69 73 69 74 28 44 62 46 69 6c 74 65  nt Visit(DbFilte
a810: 72 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a  rExpression e)..
a820: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74      {..      ret
a830: 75 72 6e 20 56 69 73 69 74 46 69 6c 74 65 72 45  urn VisitFilterE
a840: 78 70 72 65 73 73 69 6f 6e 28 65 2e 49 6e 70 75  xpression(e.Inpu
a850: 74 2c 20 65 2e 50 72 65 64 69 63 61 74 65 2c 20  t, e.Predicate, 
a860: 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a  false);..    }..
a870: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
a880: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4c 61 6d  ry>..    /// Lam
a890: 62 64 61 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  bda functions ar
a8a0: 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e  e not supported.
a8b0: 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 75  ..    /// The fu
a8c0: 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f 72 74 65  nctions supporte
a8d0: 64 20 61 72 65 3a 0d 0a 20 20 20 20 2f 2f 2f 20  d are:..    /// 
a8e0: 3c 6c 69 73 74 20 74 79 70 65 3d 22 6e 75 6d 62  <list type="numb
a8f0: 65 72 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 69  er">..    /// <i
a900: 74 65 6d 3e 43 61 6e 6f 6e 69 63 61 6c 20 46 75  tem>Canonical Fu
a910: 6e 63 74 69 6f 6e 73 20 2d 20 57 65 20 72 65 63  nctions - We rec
a920: 6f 67 6e 69 7a 65 20 74 68 65 73 65 20 62 79 20  ognize these by 
a930: 74 68 65 69 72 20 64 61 74 61 73 70 61 63 65 2c  their dataspace,
a940: 20 69 74 20 69 73 20 44 61 74 61 53 70 61 63 65   it is DataSpace
a950: 2e 43 53 70 61 63 65 3c 2f 69 74 65 6d 3e 0d 0a  .CSpace</item>..
a960: 20 20 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 53 74      /// <item>St
a970: 6f 72 65 20 46 75 6e 63 74 69 6f 6e 73 20 2d 20  ore Functions - 
a980: 57 65 20 72 65 63 6f 67 6e 69 7a 65 20 74 68 65  We recognize the
a990: 73 65 20 62 79 20 74 68 65 20 42 75 69 6c 74 49  se by the BuiltI
a9a0: 6e 41 74 74 72 69 62 75 74 65 20 61 6e 64 20 6e  nAttribute and n
a9b0: 6f 74 20 62 65 69 6e 67 20 43 61 6e 6f 6e 69 63  ot being Canonic
a9c0: 61 6c 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f  al</item>..    /
a9d0: 2f 2f 20 3c 69 74 65 6d 3e 55 73 65 72 2d 64 65  // <item>User-de
a9e0: 66 69 6e 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  fined Functions 
a9f0: 2d 20 41 6c 6c 20 74 68 65 20 72 65 73 74 20 65  - All the rest e
aa00: 78 63 65 70 74 20 66 6f 72 20 4c 61 6d 62 64 61  xcept for Lambda
aa10: 20 66 75 6e 63 74 69 6f 6e 73 3c 2f 69 74 65 6d   functions</item
aa20: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 6c 69 73  >..    /// </lis
aa30: 74 3e 0d 0a 20 20 20 20 2f 2f 2f 20 57 65 20 68  t>..    /// We h
aa40: 61 6e 64 6c 65 20 43 61 6e 6f 6e 69 63 61 6c 20  andle Canonical 
aa50: 61 6e 64 20 53 74 6f 72 65 20 66 75 6e 63 74 69  and Store functi
aa60: 6f 6e 73 20 74 68 65 20 73 61 6d 65 20 77 61 79  ons the same way
aa70: 3a 20 49 66 20 74 68 65 79 20 61 72 65 20 69 6e  : If they are in
aa80: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
aa90: 63 74 69 6f 6e 73 0d 0a 20 20 20 20 2f 2f 2f 20  ctions..    /// 
aaa0: 74 68 61 74 20 6e 65 65 64 20 73 70 65 63 69 61  that need specia
aab0: 6c 20 68 61 6e 64 6c 69 6e 67 2c 20 77 65 20 69  l handling, we i
aac0: 6e 76 6f 6b 65 20 74 68 65 20 61 70 70 72 6f 70  nvoke the approp
aad0: 72 69 61 74 65 20 68 61 6e 64 6c 65 72 2c 20 6f  riate handler, o
aae0: 74 68 65 72 77 69 73 65 20 77 65 20 74 72 61 6e  therwise we tran
aaf0: 73 6c 61 74 65 20 74 68 65 6d 20 74 6f 0d 0a 20  slate them to.. 
ab00: 20 20 20 2f 2f 2f 20 46 75 6e 63 74 69 6f 6e 4e     /// FunctionN
ab10: 61 6d 65 28 61 72 67 31 2c 20 61 72 67 32 2c 20  ame(arg1, arg2, 
ab20: 2e 2e 2e 2c 20 61 72 67 6e 29 2e 0d 0a 20 20 20  ..., argn)...   
ab30: 20 2f 2f 2f 20 57 65 20 74 72 61 6e 73 6c 61 74   /// We translat
ab40: 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  e user-defined f
ab50: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 4e 61 6d 65  unctions to Name
ab60: 73 70 61 63 65 4e 61 6d 65 2e 46 75 6e 63 74 69  spaceName.Functi
ab70: 6f 6e 4e 61 6d 65 28 61 72 67 31 2c 20 61 72 67  onName(arg1, arg
ab80: 32 2c 20 2e 2e 2e 2c 20 61 72 67 6e 29 2e 0d 0a  2, ..., argn)...
ab90: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
aba0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  y>..    /// <par
abb0: 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61  am name="e"></pa
abc0: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
abd0: 65 74 75 72 6e 73 3e 41 20 3c 73 65 65 20 63 72  eturns>A <see cr
abe0: 65 66 3d 22 53 71 6c 42 75 69 6c 64 65 72 22 2f  ef="SqlBuilder"/
abf0: 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  ></returns>..   
ac00: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
ac10: 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69   ISqlFragment Vi
ac20: 73 69 74 28 44 62 46 75 6e 63 74 69 6f 6e 45 78  sit(DbFunctionEx
ac30: 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20  pression e)..   
ac40: 20 7b 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20   {..      //..  
ac50: 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 69 66 20      // check if 
ac60: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
ac70: 73 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 70  s special case p
ac80: 72 6f 63 65 73 73 69 6e 67 2c 20 69 66 20 73 6f  rocessing, if so
ac90: 2c 20 64 65 6c 65 67 61 74 65 73 20 74 6f 20 69  , delegates to i
aca0: 74 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20  t..      //..   
acb0: 20 20 20 69 66 20 28 49 73 53 70 65 63 69 61 6c     if (IsSpecial
acc0: 42 75 69 6c 74 49 6e 46 75 6e 63 74 69 6f 6e 28  BuiltInFunction(
acd0: 65 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  e))..      {..  
ace0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 48 61 6e        return Han
acf0: 64 6c 65 53 70 65 63 69 61 6c 42 75 69 6c 74 49  dleSpecialBuiltI
ad00: 6e 46 75 6e 63 74 69 6f 6e 28 65 29 3b 0d 0a 20  nFunction(e);.. 
ad10: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ad20: 69 66 20 28 49 73 53 70 65 63 69 61 6c 43 61 6e  if (IsSpecialCan
ad30: 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 28 65  onicalFunction(e
ad40: 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ))..      {..   
ad50: 20 20 20 20 20 72 65 74 75 72 6e 20 48 61 6e 64       return Hand
ad60: 6c 65 53 70 65 63 69 61 6c 43 61 6e 6f 6e 69 63  leSpecialCanonic
ad70: 61 6c 46 75 6e 63 74 69 6f 6e 28 65 29 3b 0d 0a  alFunction(e);..
ad80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
ad90: 20 72 65 74 75 72 6e 20 48 61 6e 64 6c 65 46 75   return HandleFu
ada0: 6e 63 74 69 6f 6e 44 65 66 61 75 6c 74 28 65 29  nctionDefault(e)
adb0: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 0d 0a 20 20  ;..    }......  
adc0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
add0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72  .    /// <see cr
ade0: 65 66 3d 22 44 62 45 6e 74 69 74 79 52 65 66 45  ef="DbEntityRefE
adf0: 78 70 72 65 73 73 69 6f 6e 22 2f 3e 20 69 73 20  xpression"/> is 
ae00: 69 6c 6c 65 67 61 6c 20 61 74 20 74 68 69 73 20  illegal at this 
ae10: 73 74 61 67 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c  stage..    /// <
ae20: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
ae30: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
ae40: 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  e"></param>..   
ae50: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f   /// <returns></
ae60: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75  returns>..    pu
ae70: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49 53  blic override IS
ae80: 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74  qlFragment Visit
ae90: 28 44 62 45 6e 74 69 74 79 52 65 66 45 78 70 72  (DbEntityRefExpr
aea0: 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b  ession e)..    {
aeb0: 0d 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65  ..      throw ne
aec0: 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64 45 78  w NotSupportedEx
aed0: 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20  ception();..    
aee0: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
aef0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
af00: 3c 73 65 65 20 63 72 65 66 3d 22 44 62 52 65 66  <see cref="DbRef
af10: 4b 65 79 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e  KeyExpression"/>
af20: 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 74 20 74   is illegal at t
af30: 68 69 73 20 73 74 61 67 65 0d 0a 20 20 20 20 2f  his stage..    /
af40: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
af50: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
af60: 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  me="e"></param>.
af70: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
af80: 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  s></returns>..  
af90: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
afa0: 65 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56  e ISqlFragment V
afb0: 69 73 69 74 28 44 62 52 65 66 4b 65 79 45 78 70  isit(DbRefKeyExp
afc0: 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ression e)..    
afd0: 7b 0d 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e  {..      throw n
afe0: 65 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64 45  ew NotSupportedE
aff0: 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20 20  xception();..   
b000: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
b010: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
b020: 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69 73 69   <see cref="Visi
b030: 74 28 44 62 46 69 6c 74 65 72 45 78 70 72 65 73  t(DbFilterExpres
b040: 73 69 6f 6e 29 22 2f 3e 20 66 6f 72 20 67 65 6e  sion)"/> for gen
b050: 65 72 61 6c 20 64 65 74 61 69 6c 73 2e 0d 0a 20  eral details... 
b060: 20 20 20 2f 2f 2f 20 57 65 20 6d 6f 64 69 66 79     /// We modify
b070: 20 62 6f 74 68 20 74 68 65 20 47 72 6f 75 70 42   both the GroupB
b080: 79 20 61 6e 64 20 74 68 65 20 53 65 6c 65 63 74  y and the Select
b090: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
b0a0: 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e  qlSelectStatemen
b0b0: 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 47 72 6f 75  t...    /// Grou
b0c0: 70 42 79 20 67 65 74 73 20 6a 75 73 74 20 74 68  pBy gets just th
b0d0: 65 20 6b 65 79 73 20 77 69 74 68 6f 75 74 20 61  e keys without a
b0e0: 6c 69 61 73 65 73 2c 0d 0a 20 20 20 20 2f 2f 2f  liases,..    ///
b0f0: 20 61 6e 64 20 53 65 6c 65 63 74 20 67 65 74 73   and Select gets
b100: 20 74 68 65 20 6b 65 79 73 20 61 6e 64 20 74 68   the keys and th
b110: 65 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  e aggregates wit
b120: 68 20 61 6c 69 61 73 65 73 2e 0d 0a 20 20 20 20  h aliases...    
b130: 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 57 68 65  ///..    /// Whe
b140: 6e 65 76 65 72 20 74 68 65 72 65 20 65 78 69 73  never there exis
b150: 74 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ts at least one 
b160: 61 67 67 72 65 67 61 74 65 20 77 69 74 68 20 61  aggregate with a
b170: 6e 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  n argument that 
b180: 69 73 20 6e 6f 74 20 69 73 20 6e 6f 74 20 61 20  is not is not a 
b190: 73 69 6d 70 6c 65 0d 0a 20 20 20 20 2f 2f 2f 20  simple..    /// 
b1a0: 3c 73 65 65 20 63 72 65 66 3d 22 44 62 50 72 6f  <see cref="DbPro
b1b0: 70 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e 22  pertyExpression"
b1c0: 2f 3e 20 20 6f 76 65 72 20 3c 73 65 65 20 63 72  />  over <see cr
b1d0: 65 66 3d 22 44 62 56 61 72 69 61 62 6c 65 52 65  ef="DbVariableRe
b1e0: 66 65 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f  ferenceExpressio
b1f0: 6e 22 2f 3e 2c 0d 0a 20 20 20 20 2f 2f 2f 20 77  n"/>,..    /// w
b200: 65 20 63 72 65 61 74 65 20 61 20 6e 65 73 74 65  e create a neste
b210: 64 20 71 75 65 72 79 20 69 6e 20 77 68 69 63 68  d query in which
b220: 20 77 65 20 61 6c 69 61 73 20 74 68 65 20 61 72   we alias the ar
b230: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 61  guments to the a
b240: 67 67 72 65 67 61 74 65 73 2e 0d 0a 20 20 20 20  ggregates...    
b250: 2f 2f 2f 20 54 68 61 74 20 69 73 20 64 75 65 20  /// That is due 
b260: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
b270: 20 74 77 6f 20 6c 69 6d 69 74 61 74 69 6f 6e 73   two limitations
b280: 20 6f 66 20 53 71 6c 20 53 65 72 76 65 72 3a 0d   of Sql Server:.
b290: 0a 20 20 20 20 2f 2f 2f 20 3c 6c 69 73 74 20 74  .    /// <list t
b2a0: 79 70 65 3d 22 6e 75 6d 62 65 72 22 3e 0d 0a 20  ype="number">.. 
b2b0: 20 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 49 66 20     /// <item>If 
b2c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  an expression be
b2d0: 69 6e 67 20 61 67 67 72 65 67 61 74 65 64 20 63  ing aggregated c
b2e0: 6f 6e 74 61 69 6e 73 20 61 6e 20 6f 75 74 65 72  ontains an outer
b2f0: 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e   reference, then
b300: 20 74 68 61 74 20 6f 75 74 65 72 0d 0a 20 20 20   that outer..   
b310: 20 2f 2f 2f 20 72 65 66 65 72 65 6e 63 65 20 6d   /// reference m
b320: 75 73 74 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  ust be the only 
b330: 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
b340: 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
b350: 69 6f 6e 20 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20  ion </item>..   
b360: 20 2f 2f 2f 20 3c 69 74 65 6d 3e 53 71 6c 20 53   /// <item>Sql S
b370: 65 72 76 65 72 20 63 61 6e 6e 6f 74 20 70 65 72  erver cannot per
b380: 66 6f 72 6d 20 61 6e 20 61 67 67 72 65 67 61 74  form an aggregat
b390: 65 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 61 6e  e function on an
b3a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
b3b0: 61 69 6e 69 6e 67 0d 0a 20 20 20 20 2f 2f 2f 20  aining..    /// 
b3c0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
b3d0: 61 20 73 75 62 71 75 65 72 79 2e 20 3c 2f 69 74  a subquery. </it
b3e0: 65 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 6c  em>..    /// </l
b3f0: 69 73 74 3e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20  ist>..    ///.. 
b400: 20 20 20 2f 2f 2f 20 54 68 65 20 64 65 66 61 75     /// The defau
b410: 6c 74 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  lt translation, 
b420: 77 69 74 68 6f 75 74 20 69 6e 6e 65 72 20 71 75  without inner qu
b430: 65 72 79 20 69 73 3a 0d 0a 20 20 20 20 2f 2f 2f  ery is:..    ///
b440: 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 53 45  ..    ///     SE
b450: 4c 45 43 54 0d 0a 20 20 20 20 2f 2f 2f 20 20 20  LECT..    ///   
b460: 20 20 20 20 20 20 6b 65 78 70 31 20 41 53 20 6b        kexp1 AS k
b470: 65 79 31 2c 20 6b 65 78 70 32 20 41 53 20 6b 65  ey1, kexp2 AS ke
b480: 79 32 2c 2e 2e 2e 20 6b 65 78 70 6e 20 41 53 20  y2,... kexpn AS 
b490: 6b 65 79 6e 2c 0d 0a 20 20 20 20 2f 2f 2f 20 20  keyn,..    ///  
b4a0: 20 20 20 20 20 20 20 61 67 67 66 31 28 61 65 78         aggf1(aex
b4b0: 70 72 31 29 20 41 53 20 61 67 67 31 2c 20 2e 2e  pr1) AS agg1, ..
b4c0: 20 61 67 67 66 6e 28 61 65 78 70 72 6e 29 20 41   aggfn(aexprn) A
b4d0: 53 20 61 67 67 6e 0d 0a 20 20 20 20 2f 2f 2f 20  S aggn..    /// 
b4e0: 20 20 20 20 46 52 4f 4d 20 69 6e 70 75 74 20 41      FROM input A
b4f0: 53 20 61 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 20  S a..    ///    
b500: 20 47 52 4f 55 50 20 42 59 20 6b 65 78 70 31 2c   GROUP BY kexp1,
b510: 20 6b 65 78 70 32 2c 20 2e 2e 20 6b 65 78 70 6e   kexp2, .. kexpn
b520: 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f  ..    ///..    /
b530: 2f 2f 20 57 68 65 6e 20 77 65 20 69 6e 6a 65 63  // When we injec
b540: 74 20 61 6e 20 69 6e 6e 6e 65 72 20 71 75 65 72  t an innner quer
b550: 79 2c 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  y, the equivalen
b560: 74 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73  t translation is
b570: 3a 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20  :..    ///..    
b580: 2f 2f 2f 20 20 20 20 20 53 45 4c 45 43 54 0d 0a  ///     SELECT..
b590: 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20      ///         
b5a0: 6b 65 79 31 20 41 53 20 6b 65 79 31 2c 20 6b 65  key1 AS key1, ke
b5b0: 79 32 20 41 53 20 6b 65 79 32 2c 20 2e 2e 20 6b  y2 AS key2, .. k
b5c0: 65 79 6e 20 41 53 20 6b 65 79 73 2c 0d 0a 20 20  eyn AS keys,..  
b5d0: 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 61 67    ///         ag
b5e0: 67 66 31 28 61 67 67 31 29 20 41 53 20 61 67 67  gf1(agg1) AS agg
b5f0: 31 2c 20 61 67 67 66 6e 28 61 67 67 6e 29 20 41  1, aggfn(aggn) A
b600: 53 20 61 67 67 6e 0d 0a 20 20 20 20 2f 2f 2f 20  S aggn..    /// 
b610: 20 20 20 20 46 52 4f 4d 20 28 0d 0a 20 20 20 20      FROM (..    
b620: 2f 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  ///             
b630: 53 45 4c 45 43 54 0d 0a 20 20 20 20 2f 2f 2f 20  SELECT..    /// 
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 6b 65 78 70 31 20 41 53 20 6b 65 79 31 2c 20 6b  kexp1 AS key1, k
b660: 65 78 70 32 20 41 53 20 6b 65 79 32 2c 2e 2e 2e  exp2 AS key2,...
b670: 20 6b 65 78 70 6e 20 41 53 20 6b 65 79 6e 2c 0d   kexpn AS keyn,.
b680: 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20  .    ///        
b690: 20 20 20 20 20 20 20 20 20 61 65 78 70 72 31 20           aexpr1 
b6a0: 41 53 20 61 67 67 31 2c 20 2e 2e 20 61 65 78 70  AS agg1, .. aexp
b6b0: 72 6e 20 41 53 20 61 67 67 6e 0d 0a 20 20 20 20  rn AS aggn..    
b6c0: 2f 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  ///             
b6d0: 46 52 4f 4d 20 69 6e 70 75 74 20 41 53 20 61 0d  FROM input AS a.
b6e0: 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20  .    ///        
b6f0: 20 29 20 61 73 20 61 0d 0a 20 20 20 20 2f 2f 2f   ) as a..    ///
b700: 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 6b 65       GROUP BY ke
b710: 79 31 2c 20 6b 65 79 32 2c 20 6b 65 79 6e 0d 0a  y1, key2, keyn..
b720: 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f      ///..    ///
b730: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
b740: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
b750: 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ="e"></param>.. 
b760: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
b770: 41 20 3c 73 65 65 20 63 72 65 66 3d 22 53 71 6c  A <see cref="Sql
b780: 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 22  SelectStatement"
b790: 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  /></returns>..  
b7a0: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
b7b0: 65 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56  e ISqlFragment V
b7c0: 69 73 69 74 28 44 62 47 72 6f 75 70 42 79 45 78  isit(DbGroupByEx
b7d0: 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20  pression e)..   
b7e0: 20 7b 0d 0a 20 20 20 20 20 20 53 79 6d 62 6f 6c   {..      Symbol
b7f0: 20 66 72 6f 6d 53 79 6d 62 6f 6c 3b 0d 0a 20 20   fromSymbol;..  
b800: 20 20 20 20 2f 2f 53 71 6c 53 65 6c 65 63 74 53      //SqlSelectS
b810: 74 61 74 65 6d 65 6e 74 20 72 65 73 75 6c 74 20  tatement result 
b820: 3d 20 56 69 73 69 74 49 6e 70 75 74 45 78 70 72  = VisitInputExpr
b830: 65 73 73 69 6f 6e 28 65 2e 49 6e 70 75 74 2e 45  ession(e.Input.E
b840: 78 70 72 65 73 73 69 6f 6e 2c 0d 0a 20 20 20 20  xpression,..    
b850: 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65    SqlSelectState
b860: 6d 65 6e 74 20 69 6e 6e 65 72 51 75 65 72 79 20  ment innerQuery 
b870: 3d 20 56 69 73 69 74 49 6e 70 75 74 45 78 70 72  = VisitInputExpr
b880: 65 73 73 69 6f 6e 28 65 2e 49 6e 70 75 74 2e 45  ession(e.Input.E
b890: 78 70 72 65 73 73 69 6f 6e 2c 0d 0a 20 20 20 20  xpression,..    
b8a0: 20 20 20 20 20 20 65 2e 49 6e 70 75 74 2e 56 61        e.Input.Va
b8b0: 72 69 61 62 6c 65 4e 61 6d 65 2c 20 65 2e 49 6e  riableName, e.In
b8c0: 70 75 74 2e 56 61 72 69 61 62 6c 65 54 79 70 65  put.VariableType
b8d0: 2c 20 6f 75 74 20 66 72 6f 6d 53 79 6d 62 6f 6c  , out fromSymbol
b8e0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 47  );....      // G
b8f0: 72 6f 75 70 42 79 20 69 73 20 63 6f 6d 70 61 74  roupBy is compat
b900: 69 62 6c 65 20 77 69 74 68 20 46 69 6c 74 65 72  ible with Filter
b910: 20 61 6e 64 20 4f 72 64 65 72 42 79 0d 0a 20 20   and OrderBy..  
b920: 20 20 20 20 2f 2f 20 62 75 74 20 6e 6f 74 20 77      // but not w
b930: 69 74 68 20 50 72 6f 6a 65 63 74 2c 20 47 72 6f  ith Project, Gro
b940: 75 70 42 79 0d 0a 20 20 20 20 20 20 69 66 20 28  upBy..      if (
b950: 21 49 73 43 6f 6d 70 61 74 69 62 6c 65 28 69 6e  !IsCompatible(in
b960: 6e 65 72 51 75 65 72 79 2c 20 65 2e 45 78 70 72  nerQuery, e.Expr
b970: 65 73 73 69 6f 6e 4b 69 6e 64 29 29 0d 0a 20 20  essionKind))..  
b980: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69      {..        i
b990: 6e 6e 65 72 51 75 65 72 79 20 3d 20 43 72 65 61  nnerQuery = Crea
b9a0: 74 65 4e 65 77 53 65 6c 65 63 74 53 74 61 74 65  teNewSelectState
b9b0: 6d 65 6e 74 28 69 6e 6e 65 72 51 75 65 72 79 2c  ment(innerQuery,
b9c0: 20 65 2e 49 6e 70 75 74 2e 56 61 72 69 61 62 6c   e.Input.Variabl
b9d0: 65 4e 61 6d 65 2c 20 65 2e 49 6e 70 75 74 2e 56  eName, e.Input.V
b9e0: 61 72 69 61 62 6c 65 54 79 70 65 2c 20 6f 75 74  ariableType, out
b9f0: 20 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20   fromSymbol);.. 
ba00: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ba10: 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 53  selectStatementS
ba20: 74 61 63 6b 2e 50 75 73 68 28 69 6e 6e 65 72 51  tack.Push(innerQ
ba30: 75 65 72 79 29 3b 0d 0a 20 20 20 20 20 20 73 79  uery);..      sy
ba40: 6d 62 6f 6c 54 61 62 6c 65 2e 45 6e 74 65 72 53  mbolTable.EnterS
ba50: 63 6f 70 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  cope();....     
ba60: 20 41 64 64 46 72 6f 6d 53 79 6d 62 6f 6c 28 69   AddFromSymbol(i
ba70: 6e 6e 65 72 51 75 65 72 79 2c 20 65 2e 49 6e 70  nnerQuery, e.Inp
ba80: 75 74 2e 56 61 72 69 61 62 6c 65 4e 61 6d 65 2c  ut.VariableName,
ba90: 20 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20   fromSymbol);.. 
baa0: 20 20 20 20 20 2f 2f 20 54 68 69 73 20 6c 69 6e       // This lin
bab0: 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  e is not present
bac0: 20 66 6f 72 20 6f 74 68 65 72 20 72 65 6c 61 74   for other relat
bad0: 69 6f 6e 61 6c 20 6e 6f 64 65 73 2e 0d 0a 20 20  ional nodes...  
bae0: 20 20 20 20 73 79 6d 62 6f 6c 54 61 62 6c 65 2e      symbolTable.
baf0: 41 64 64 28 65 2e 49 6e 70 75 74 2e 47 72 6f 75  Add(e.Input.Grou
bb00: 70 56 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20 66  pVariableName, f
bb10: 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 0d 0a 0d  romSymbol);.....
bb20: 0a 20 20 20 20 20 20 2f 2f 20 54 68 65 20 65 6e  .      // The en
bb30: 75 6d 65 72 61 74 6f 72 20 69 73 20 73 68 61 72  umerator is shar
bb40: 65 64 20 62 79 20 62 6f 74 68 20 74 68 65 20 6b  ed by both the k
bb50: 65 79 73 20 61 6e 64 20 74 68 65 20 61 67 67 72  eys and the aggr
bb60: 65 67 61 74 65 73 2c 0d 0a 20 20 20 20 20 20 2f  egates,..      /
bb70: 2f 20 73 6f 2c 20 77 65 20 64 6f 20 6e 6f 74 20  / so, we do not 
bb80: 63 6c 6f 73 65 20 69 74 20 69 6e 20 62 65 74 77  close it in betw
bb90: 65 65 6e 2e 0d 0a 20 20 20 20 20 20 52 6f 77 54  een...      RowT
bba0: 79 70 65 20 67 72 6f 75 70 42 79 54 79 70 65 20  ype groupByType 
bbb0: 3d 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72  = MetadataHelper
bbc0: 73 2e 47 65 74 45 64 6d 54 79 70 65 3c 52 6f 77  s.GetEdmType<Row
bbd0: 54 79 70 65 3e 28 4d 65 74 61 64 61 74 61 48 65  Type>(MetadataHe
bbe0: 6c 70 65 72 73 2e 47 65 74 45 64 6d 54 79 70 65  lpers.GetEdmType
bbf0: 3c 43 6f 6c 6c 65 63 74 69 6f 6e 54 79 70 65 3e  <CollectionType>
bc00: 28 65 2e 52 65 73 75 6c 74 54 79 70 65 29 2e 54  (e.ResultType).T
bc10: 79 70 65 55 73 61 67 65 29 3b 0d 0a 0d 0a 20 20  ypeUsage);....  
bc20: 20 20 20 20 2f 2f 57 68 65 6e 65 76 65 72 20 74      //Whenever t
bc30: 68 65 72 65 20 65 78 69 73 74 73 20 61 74 20 6c  here exists at l
bc40: 65 61 73 74 20 6f 6e 65 20 61 67 67 72 65 67 61  east one aggrega
bc50: 74 65 20 77 69 74 68 20 61 6e 20 61 72 67 75 6d  te with an argum
bc60: 65 6e 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ent that is not 
bc70: 73 69 6d 70 6c 79 20 61 20 50 72 6f 70 65 72 74  simply a Propert
bc80: 79 45 78 70 72 65 73 73 69 6f 6e 0d 0a 20 20 20  yExpression..   
bc90: 20 20 20 2f 2f 20 6f 76 65 72 20 61 20 56 61 72     // over a Var
bca0: 52 65 66 45 78 70 72 65 73 73 69 6f 6e 2c 20 77  RefExpression, w
bcb0: 65 20 6e 65 65 64 20 61 20 6e 65 73 74 65 64 20  e need a nested 
bcc0: 71 75 65 72 79 20 69 6e 20 77 68 69 63 68 20 77  query in which w
bcd0: 65 20 61 6c 69 61 73 20 74 68 65 20 61 72 67 75  e alias the argu
bce0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 61 67 67  ments to the agg
bcf0: 72 65 67 61 74 65 73 2e 0d 0a 20 20 20 20 20 20  regates...      
bd00: 62 6f 6f 6c 20 6e 65 65 64 73 49 6e 6e 65 72 51  bool needsInnerQ
bd10: 75 65 72 79 20 3d 20 4e 65 65 64 73 49 6e 6e 65  uery = NeedsInne
bd20: 72 51 75 65 72 79 28 65 2e 41 67 67 72 65 67 61  rQuery(e.Aggrega
bd30: 74 65 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 53  tes);....      S
bd40: 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e  qlSelectStatemen
bd50: 74 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 20  t result;..     
bd60: 20 69 66 20 28 6e 65 65 64 73 49 6e 6e 65 72 51   if (needsInnerQ
bd70: 75 65 72 79 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  uery)..      {..
bd80: 20 20 20 20 20 20 20 20 2f 2f 43 72 65 61 74 65          //Create
bd90: 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   the inner query
bda0: 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  ..        result
bdb0: 20 3d 20 43 72 65 61 74 65 4e 65 77 53 65 6c 65   = CreateNewSele
bdc0: 63 74 53 74 61 74 65 6d 65 6e 74 28 69 6e 6e 65  ctStatement(inne
bdd0: 72 51 75 65 72 79 2c 20 65 2e 49 6e 70 75 74 2e  rQuery, e.Input.
bde0: 56 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20 65 2e  VariableName, e.
bdf0: 49 6e 70 75 74 2e 56 61 72 69 61 62 6c 65 54 79  Input.VariableTy
be00: 70 65 2c 20 66 61 6c 73 65 2c 20 6f 75 74 20 66  pe, false, out f
be10: 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20  romSymbol);..   
be20: 20 20 20 20 20 41 64 64 46 72 6f 6d 53 79 6d 62       AddFromSymb
be30: 6f 6c 28 72 65 73 75 6c 74 2c 20 65 2e 49 6e 70  ol(result, e.Inp
be40: 75 74 2e 56 61 72 69 61 62 6c 65 4e 61 6d 65 2c  ut.VariableName,
be50: 20 66 72 6f 6d 53 79 6d 62 6f 6c 2c 20 66 61 6c   fromSymbol, fal
be60: 73 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  se);..      }.. 
be70: 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
be80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75   {..        resu
be90: 6c 74 20 3d 20 69 6e 6e 65 72 51 75 65 72 79 3b  lt = innerQuery;
bea0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
beb0: 20 20 20 75 73 69 6e 67 20 28 49 45 6e 75 6d 65     using (IEnume
bec0: 72 61 74 6f 72 3c 45 64 6d 50 72 6f 70 65 72 74  rator<EdmPropert
bed0: 79 3e 20 6d 65 6d 62 65 72 73 20 3d 20 67 72 6f  y> members = gro
bee0: 75 70 42 79 54 79 70 65 2e 50 72 6f 70 65 72 74  upByType.Propert
bef0: 69 65 73 2e 47 65 74 45 6e 75 6d 65 72 61 74 6f  ies.GetEnumerato
bf00: 72 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  r())..      {.. 
bf10: 20 20 20 20 20 20 20 6d 65 6d 62 65 72 73 2e 4d         members.M
bf20: 6f 76 65 4e 65 78 74 28 29 3b 0d 0a 20 20 20 20  oveNext();..    
bf30: 20 20 20 20 44 65 62 75 67 2e 41 73 73 65 72 74      Debug.Assert
bf40: 28 72 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e 49  (result.Select.I
bf50: 73 45 6d 70 74 79 29 3b 0d 0a 0d 0a 20 20 20 20  sEmpty);....    
bf60: 20 20 20 20 73 74 72 69 6e 67 20 73 65 70 61 72      string separ
bf70: 61 74 6f 72 20 3d 20 53 74 72 69 6e 67 2e 45 6d  ator = String.Em
bf80: 70 74 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  pty;....        
bf90: 66 6f 72 65 61 63 68 20 28 44 62 45 78 70 72 65  foreach (DbExpre
bfa0: 73 73 69 6f 6e 20 6b 65 79 20 69 6e 20 65 2e 4b  ssion key in e.K
bfb0: 65 79 73 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  eys)..        {.
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 45 64 6d 50 72  .          EdmPr
bfd0: 6f 70 65 72 74 79 20 6d 65 6d 62 65 72 20 3d 20  operty member = 
bfe0: 6d 65 6d 62 65 72 73 2e 43 75 72 72 65 6e 74 3b  members.Current;
bff0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 69  ..          stri
c000: 6e 67 20 61 6c 69 61 73 20 3d 20 51 75 6f 74 65  ng alias = Quote
c010: 49 64 65 6e 74 69 66 69 65 72 28 6d 65 6d 62 65  Identifier(membe
c020: 72 2e 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20  r.Name);....    
c030: 20 20 20 20 20 20 72 65 73 75 6c 74 2e 47 72 6f        result.Gro
c040: 75 70 42 79 2e 41 70 70 65 6e 64 28 73 65 70 61  upBy.Append(sepa
c050: 72 61 74 6f 72 29 3b 0d 0a 0d 0a 20 20 20 20 20  rator);....     
c060: 20 20 20 20 20 49 53 71 6c 46 72 61 67 6d 65 6e       ISqlFragmen
c070: 74 20 6b 65 79 53 71 6c 20 3d 20 6b 65 79 2e 41  t keySql = key.A
c080: 63 63 65 70 74 28 74 68 69 73 29 3b 0d 0a 0d 0a  ccept(this);....
c090: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 6e            if (!n
c0a0: 65 65 64 73 49 6e 6e 65 72 51 75 65 72 79 29 0d  eedsInnerQuery).
c0b0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
c0c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 44 65 66 61            //Defa
c0d0: 75 6c 74 20 74 72 61 6e 73 6c 61 74 69 6f 6e 3a  ult translation:
c0e0: 20 4b 65 79 20 41 53 20 41 6c 69 61 73 0d 0a 20   Key AS Alias.. 
c0f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
c100: 74 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28  t.Select.Append(
c110: 73 65 70 61 72 61 74 6f 72 29 3b 0d 0a 20 20 20  separator);..   
c120: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e           result.
c130: 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 4c 69 6e  Select.AppendLin
c140: 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  e();..          
c150: 20 20 72 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e    result.Select.
c160: 41 70 70 65 6e 64 28 6b 65 79 53 71 6c 29 3b 0d  Append(keySql);.
c170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  .            res
c180: 75 6c 74 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e  ult.Select.Appen
c190: 64 28 22 20 41 53 20 22 29 3b 0d 0a 20 20 20 20  d(" AS ");..    
c1a0: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 53          result.S
c1b0: 65 6c 65 63 74 2e 41 70 70 65 6e 64 28 61 6c 69  elect.Append(ali
c1c0: 61 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  as);....        
c1d0: 20 20 20 20 72 65 73 75 6c 74 2e 47 72 6f 75 70      result.Group
c1e0: 42 79 2e 41 70 70 65 6e 64 28 6b 65 79 53 71 6c  By.Append(keySql
c1f0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
c200: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d  .          else.
c210: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
c220: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65            // The
c230: 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63 6f 6e   inner query con
c240: 74 61 69 6e 73 20 74 68 65 20 64 65 66 61 75 6c  tains the defaul
c250: 74 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 4b 65  t translation Ke
c260: 79 20 41 53 20 41 6c 69 61 73 0d 0a 20 20 20 20  y AS Alias..    
c270: 20 20 20 20 20 20 20 20 69 6e 6e 65 72 51 75 65          innerQue
c280: 72 79 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e 64  ry.Select.Append
c290: 28 73 65 70 61 72 61 74 6f 72 29 3b 0d 0a 20 20  (separator);..  
c2a0: 20 20 20 20 20 20 20 20 20 20 69 6e 6e 65 72 51            innerQ
c2b0: 75 65 72 79 2e 53 65 6c 65 63 74 2e 41 70 70 65  uery.Select.Appe
c2c0: 6e 64 4c 69 6e 65 28 29 3b 0d 0a 20 20 20 20 20  ndLine();..     
c2d0: 20 20 20 20 20 20 20 69 6e 6e 65 72 51 75 65 72         innerQuer
c2e0: 79 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28  y.Select.Append(
c2f0: 6b 65 79 53 71 6c 29 3b 0d 0a 20 20 20 20 20 20  keySql);..      
c300: 20 20 20 20 20 20 69 6e 6e 65 72 51 75 65 72 79        innerQuery
c310: 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28 22  .Select.Append("
c320: 20 41 53 20 22 29 3b 0d 0a 20 20 20 20 20 20 20   AS ");..       
c330: 20 20 20 20 20 69 6e 6e 65 72 51 75 65 72 79 2e       innerQuery.
c340: 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28 61 6c  Select.Append(al
c350: 69 61 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ias);....       
c360: 20 20 20 20 20 2f 2f 54 68 65 20 6f 75 74 65 72       //The outer
c370: 20 72 65 73 75 6c 74 69 6e 67 20 71 75 65 72 79   resulting query
c380: 20 70 72 6f 6a 65 63 74 73 20 6f 76 65 72 20 74   projects over t
c390: 68 65 20 6b 65 79 20 61 6c 69 61 73 65 64 20 69  he key aliased i
c3a0: 6e 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72  n the inner quer
c3b0: 79 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y:..            
c3c0: 2f 2f 20 20 66 72 6f 6d 53 79 6d 62 6f 6c 2e 41  //  fromSymbol.A
c3d0: 6c 69 61 73 20 41 53 20 41 6c 69 61 73 0d 0a 20  lias AS Alias.. 
c3e0: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
c3f0: 74 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28  t.Select.Append(
c400: 73 65 70 61 72 61 74 6f 72 29 3b 0d 0a 20 20 20  separator);..   
c410: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e           result.
c420: 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 4c 69 6e  Select.AppendLin
c430: 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  e();..          
c440: 20 20 72 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e    result.Select.
c450: 41 70 70 65 6e 64 28 66 72 6f 6d 53 79 6d 62 6f  Append(fromSymbo
c460: 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l);..           
c470: 20 72 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e 41   result.Select.A
c480: 70 70 65 6e 64 28 22 2e 22 29 3b 0d 0a 20 20 20  ppend(".");..   
c490: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e           result.
c4a0: 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28 61 6c  Select.Append(al
c4b0: 69 61 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ias);..         
c4c0: 20 20 20 72 65 73 75 6c 74 2e 53 65 6c 65 63 74     result.Select
c4d0: 2e 41 70 70 65 6e 64 28 22 20 41 53 20 22 29 3b  .Append(" AS ");
c4e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
c4f0: 73 75 6c 74 2e 53 65 6c 65 63 74 2e 41 70 70 65  sult.Select.Appe
c500: 6e 64 28 61 6c 69 61 73 29 3b 0d 0a 0d 0a 20 20  nd(alias);....  
c510: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
c520: 2e 47 72 6f 75 70 42 79 2e 41 70 70 65 6e 64 28  .GroupBy.Append(
c530: 61 6c 69 61 73 29 3b 0d 0a 20 20 20 20 20 20 20  alias);..       
c540: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
c550: 20 20 73 65 70 61 72 61 74 6f 72 20 3d 20 22 2c    separator = ",
c560: 20 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6d   ";..          m
c570: 65 6d 62 65 72 73 2e 4d 6f 76 65 4e 65 78 74 28  embers.MoveNext(
c580: 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  );..        }...
c590: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
c5a0: 20 28 44 62 41 67 67 72 65 67 61 74 65 20 61 67   (DbAggregate ag
c5b0: 67 72 65 67 61 74 65 20 69 6e 20 65 2e 41 67 67  gregate in e.Agg
c5c0: 72 65 67 61 74 65 73 29 0d 0a 20 20 20 20 20 20  regates)..      
c5d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 45    {..          E
c5e0: 64 6d 50 72 6f 70 65 72 74 79 20 6d 65 6d 62 65  dmProperty membe
c5f0: 72 20 3d 20 6d 65 6d 62 65 72 73 2e 43 75 72 72  r = members.Curr
c600: 65 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ent;..          
c610: 73 74 72 69 6e 67 20 61 6c 69 61 73 20 3d 20 51  string alias = Q
c620: 75 6f 74 65 49 64 65 6e 74 69 66 69 65 72 28 6d  uoteIdentifier(m
c630: 65 6d 62 65 72 2e 4e 61 6d 65 29 3b 0d 0a 0d 0a  ember.Name);....
c640: 20 20 20 20 20 20 20 20 20 20 44 65 62 75 67 2e            Debug.
c650: 41 73 73 65 72 74 28 61 67 67 72 65 67 61 74 65  Assert(aggregate
c660: 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75 6e 74  .Arguments.Count
c670: 20 3d 3d 20 31 29 3b 0d 0a 20 20 20 20 20 20 20   == 1);..       
c680: 20 20 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20     ISqlFragment 
c690: 74 72 61 6e 73 6c 61 74 65 64 41 67 67 72 65 67  translatedAggreg
c6a0: 61 74 65 41 72 67 75 6d 65 6e 74 20 3d 20 61 67  ateArgument = ag
c6b0: 67 72 65 67 61 74 65 2e 41 72 67 75 6d 65 6e 74  gregate.Argument
c6c0: 73 5b 30 5d 2e 41 63 63 65 70 74 28 74 68 69 73  s[0].Accept(this
c6d0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
c6e0: 6f 62 6a 65 63 74 20 61 67 67 72 65 67 61 74 65  object aggregate
c6f0: 41 72 67 75 6d 65 6e 74 3b 0d 0a 0d 0a 20 20 20  Argument;....   
c700: 20 20 20 20 20 20 20 69 66 20 28 6e 65 65 64 73         if (needs
c710: 49 6e 6e 65 72 51 75 65 72 79 29 0d 0a 20 20 20  InnerQuery)..   
c720: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
c730: 20 20 20 20 20 20 2f 2f 49 6e 20 74 68 69 73 20        //In this 
c740: 63 61 73 65 20 74 68 65 20 61 72 67 75 6d 65 6e  case the argumen
c750: 74 20 74 6f 20 74 68 65 20 61 67 67 72 61 74 65  t to the aggrate
c760: 74 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 20  te is reference 
c770: 74 6f 20 74 68 65 20 6f 6e 65 20 70 72 6f 6a 65  to the one proje
c780: 63 74 65 64 20 6f 75 74 20 62 79 20 74 68 65 0d  cted out by the.
c790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
c7a0: 69 6e 6e 65 72 20 71 75 65 72 79 0d 0a 20 20 20  inner query..   
c7b0: 20 20 20 20 20 20 20 20 20 53 71 6c 42 75 69 6c           SqlBuil
c7c0: 64 65 72 20 77 72 61 70 70 69 6e 67 41 67 67 72  der wrappingAggr
c7d0: 65 67 61 74 65 41 72 67 75 6d 65 6e 74 20 3d 20  egateArgument = 
c7e0: 6e 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28 29  new SqlBuilder()
c7f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ;..            w
c800: 72 61 70 70 69 6e 67 41 67 67 72 65 67 61 74 65  rappingAggregate
c810: 41 72 67 75 6d 65 6e 74 2e 41 70 70 65 6e 64 28  Argument.Append(
c820: 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20  fromSymbol);..  
c830: 20 20 20 20 20 20 20 20 20 20 77 72 61 70 70 69            wrappi
c840: 6e 67 41 67 67 72 65 67 61 74 65 41 72 67 75 6d  ngAggregateArgum
c850: 65 6e 74 2e 41 70 70 65 6e 64 28 22 2e 22 29 3b  ent.Append(".");
c860: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ..            wr
c870: 61 70 70 69 6e 67 41 67 67 72 65 67 61 74 65 41  appingAggregateA
c880: 72 67 75 6d 65 6e 74 2e 41 70 70 65 6e 64 28 61  rgument.Append(a
c890: 6c 69 61 73 29 3b 0d 0a 20 20 20 20 20 20 20 20  lias);..        
c8a0: 20 20 20 20 61 67 67 72 65 67 61 74 65 41 72 67      aggregateArg
c8b0: 75 6d 65 6e 74 20 3d 20 77 72 61 70 70 69 6e 67  ument = wrapping
c8c0: 41 67 67 72 65 67 61 74 65 41 72 67 75 6d 65 6e  AggregateArgumen
c8d0: 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  t;....          
c8e0: 20 20 69 6e 6e 65 72 51 75 65 72 79 2e 53 65 6c    innerQuery.Sel
c8f0: 65 63 74 2e 41 70 70 65 6e 64 28 73 65 70 61 72  ect.Append(separ
c900: 61 74 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20  ator);..        
c910: 20 20 20 20 69 6e 6e 65 72 51 75 65 72 79 2e 53      innerQuery.S
c920: 65 6c 65 63 74 2e 41 70 70 65 6e 64 4c 69 6e 65  elect.AppendLine
c930: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
c940: 20 69 6e 6e 65 72 51 75 65 72 79 2e 53 65 6c 65   innerQuery.Sele
c950: 63 74 2e 41 70 70 65 6e 64 28 74 72 61 6e 73 6c  ct.Append(transl
c960: 61 74 65 64 41 67 67 72 65 67 61 74 65 41 72 67  atedAggregateArg
c970: 75 6d 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20  ument);..       
c980: 20 20 20 20 20 69 6e 6e 65 72 51 75 65 72 79 2e       innerQuery.
c990: 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28 22 20  Select.Append(" 
c9a0: 41 53 20 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  AS ");..        
c9b0: 20 20 20 20 69 6e 6e 65 72 51 75 65 72 79 2e 53      innerQuery.S
c9c0: 65 6c 65 63 74 2e 41 70 70 65 6e 64 28 61 6c 69  elect.Append(ali
c9d0: 61 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  as);..          
c9e0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73  }..          els
c9f0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  e..          {..
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 61 67 67 72              aggr
ca10: 65 67 61 74 65 41 72 67 75 6d 65 6e 74 20 3d 20  egateArgument = 
ca20: 74 72 61 6e 73 6c 61 74 65 64 41 67 67 72 65 67  translatedAggreg
ca30: 61 74 65 41 72 67 75 6d 65 6e 74 3b 0d 0a 20 20  ateArgument;..  
ca40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
ca50: 20 20 20 20 20 20 20 49 53 71 6c 46 72 61 67 6d         ISqlFragm
ca60: 65 6e 74 20 61 67 67 72 65 67 61 74 65 52 65 73  ent aggregateRes
ca70: 75 6c 74 20 3d 20 56 69 73 69 74 41 67 67 72 65  ult = VisitAggre
ca80: 67 61 74 65 28 61 67 67 72 65 67 61 74 65 2c 20  gate(aggregate, 
ca90: 61 67 67 72 65 67 61 74 65 41 72 67 75 6d 65 6e  aggregateArgumen
caa0: 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t);....         
cab0: 20 72 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e 41   result.Select.A
cac0: 70 70 65 6e 64 28 73 65 70 61 72 61 74 6f 72 29  ppend(separator)
cad0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ;..          res
cae0: 75 6c 74 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e  ult.Select.Appen
caf0: 64 4c 69 6e 65 28 29 3b 0d 0a 20 20 20 20 20 20  dLine();..      
cb00: 20 20 20 20 72 65 73 75 6c 74 2e 53 65 6c 65 63      result.Selec
cb10: 74 2e 41 70 70 65 6e 64 28 61 67 67 72 65 67 61  t.Append(aggrega
cb20: 74 65 52 65 73 75 6c 74 29 3b 0d 0a 20 20 20 20  teResult);..    
cb30: 20 20 20 20 20 20 72 65 73 75 6c 74 2e 53 65 6c        result.Sel
cb40: 65 63 74 2e 41 70 70 65 6e 64 28 22 20 41 53 20  ect.Append(" AS 
cb50: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  ");..          r
cb60: 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e 41 70 70  esult.Select.App
cb70: 65 6e 64 28 61 6c 69 61 73 29 3b 0d 0a 0d 0a 20  end(alias);.... 
cb80: 20 20 20 20 20 20 20 20 20 73 65 70 61 72 61 74           separat
cb90: 6f 72 20 3d 20 22 2c 20 22 3b 0d 0a 20 20 20 20  or = ", ";..    
cba0: 20 20 20 20 20 20 6d 65 6d 62 65 72 73 2e 4d 6f        members.Mo
cbb0: 76 65 4e 65 78 74 28 29 3b 0d 0a 20 20 20 20 20  veNext();..     
cbc0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
cbd0: 0a 0d 0a 20 20 20 20 20 20 73 79 6d 62 6f 6c 54  ...      symbolT
cbe0: 61 62 6c 65 2e 45 78 69 74 53 63 6f 70 65 28 29  able.ExitScope()
cbf0: 3b 0d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 53  ;..      selectS
cc00: 74 61 74 65 6d 65 6e 74 53 74 61 63 6b 2e 50 6f  tatementStack.Po
cc10: 70 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65  p();....      re
cc20: 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20  turn result;..  
cc30: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
cc40: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
cc50: 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69 73  / <see cref="Vis
cc60: 69 74 28 44 62 55 6e 69 6f 6e 41 6c 6c 45 78 70  it(DbUnionAllExp
cc70: 72 65 73 73 69 6f 6e 29 22 2f 3e 0d 0a 20 20 20  ression)"/>..   
cc80: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
cc90: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
cca0: 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d  name="e"></param
ccb0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
ccc0: 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  rns></returns>..
ccd0: 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
cce0: 69 64 65 20 49 53 71 6c 46 72 61 67 6d 65 6e 74  ide ISqlFragment
ccf0: 20 56 69 73 69 74 28 44 62 49 6e 74 65 72 73 65   Visit(DbInterse
cd00: 63 74 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d  ctExpression e).
cd10: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
cd20: 74 75 72 6e 20 56 69 73 69 74 53 65 74 4f 70 45  turn VisitSetOpE
cd30: 78 70 72 65 73 73 69 6f 6e 28 65 2e 4c 65 66 74  xpression(e.Left
cd40: 2c 20 65 2e 52 69 67 68 74 2c 20 22 49 4e 54 45  , e.Right, "INTE
cd50: 52 53 45 43 54 22 29 3b 0d 0a 20 20 20 20 7d 0d  RSECT");..    }.
cd60: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
cd70: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4e 6f  ary>..    /// No
cd80: 74 28 49 73 45 6d 70 74 79 29 20 68 61 73 20 74  t(IsEmpty) has t
cd90: 6f 20 62 65 20 68 61 6e 64 6c 65 64 20 73 70 65  o be handled spe
cda0: 63 69 61 6c 6c 79 2c 20 73 6f 20 77 65 20 64 65  cially, so we de
cdb0: 6c 65 67 61 74 65 20 74 6f 0d 0a 20 20 20 20 2f  legate to..    /
cdc0: 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69  // <see cref="Vi
cdd0: 73 69 74 49 73 45 6d 70 74 79 45 78 70 72 65 73  sitIsEmptyExpres
cde0: 73 69 6f 6e 22 2f 3e 2e 0d 0a 20 20 20 20 2f 2f  sion"/>...    //
cdf0: 2f 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  /..    /// </sum
ce00: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
ce10: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c  param name="e"><
ce20: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
ce30: 20 3c 72 65 74 75 72 6e 73 3e 41 20 3c 73 65 65   <returns>A <see
ce40: 20 63 72 65 66 3d 22 53 71 6c 42 75 69 6c 64 65   cref="SqlBuilde
ce50: 72 22 2f 3e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  r"/>...    /// <
ce60: 63 6f 64 65 3e 5b 4e 4f 54 5d 20 45 58 49 53 54  code>[NOT] EXIST
ce70: 53 28 20 2e 2e 2e 20 29 3c 2f 63 6f 64 65 3e 0d  S( ... )</code>.
ce80: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72  .    /// </retur
ce90: 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20  ns>..    public 
cea0: 6f 76 65 72 72 69 64 65 20 49 53 71 6c 46 72 61  override ISqlFra
ceb0: 67 6d 65 6e 74 20 56 69 73 69 74 28 44 62 49 73  gment Visit(DbIs
cec0: 45 6d 70 74 79 45 78 70 72 65 73 73 69 6f 6e 20  EmptyExpression 
ced0: 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  e)..    {..     
cee0: 20 72 65 74 75 72 6e 20 56 69 73 69 74 49 73 45   return VisitIsE
cef0: 6d 70 74 79 45 78 70 72 65 73 73 69 6f 6e 28 65  mptyExpression(e
cf00: 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 7d  , false);..    }
cf10: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
cf20: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4e  mary>..    /// N
cf30: 6f 74 28 49 73 4e 75 6c 6c 29 20 69 73 20 68 61  ot(IsNull) is ha
cf40: 6e 64 6c 65 64 20 73 70 65 63 69 61 6c 6c 79 2c  ndled specially,
cf50: 20 73 6f 20 77 65 20 64 65 6c 65 67 61 74 65 20   so we delegate 
cf60: 74 6f 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65  to..    /// <see
cf70: 20 63 72 65 66 3d 22 56 69 73 69 74 49 73 4e 75   cref="VisitIsNu
cf80: 6c 6c 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e 0d  llExpression"/>.
cf90: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
cfa0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
cfb0: 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70  ram name="e"></p
cfc0: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
cfd0: 72 65 74 75 72 6e 73 3e 41 20 3c 73 65 65 20 63  returns>A <see c
cfe0: 72 65 66 3d 22 53 71 6c 42 75 69 6c 64 65 72 22  ref="SqlBuilder"
cff0: 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 63 6f 64  />..    /// <cod
d000: 65 3e 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 3c  e>IS [NOT] NULL<
d010: 2f 63 6f 64 65 3e 0d 0a 20 20 20 20 2f 2f 2f 20  /code>..    /// 
d020: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
d030: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
d040: 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73  ISqlFragment Vis
d050: 69 74 28 44 62 49 73 4e 75 6c 6c 45 78 70 72 65  it(DbIsNullExpre
d060: 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d  ssion e)..    {.
d070: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 56 69  .      return Vi
d080: 73 69 74 49 73 4e 75 6c 6c 45 78 70 72 65 73 73  sitIsNullExpress
d090: 69 6f 6e 28 65 2c 20 66 61 6c 73 65 29 3b 0d 0a  ion(e, false);..
d0a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
d0b0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
d0c0: 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 44  /// <see cref="D
d0d0: 62 49 73 4f 66 45 78 70 72 65 73 73 69 6f 6e 22  bIsOfExpression"
d0e0: 2f 3e 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 74  /> is illegal at
d0f0: 20 74 68 69 73 20 73 74 61 67 65 0d 0a 20 20 20   this stage..   
d100: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
d110: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
d120: 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d  name="e"></param
d130: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
d140: 72 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d  rns>A <see cref=
d150: 22 53 71 6c 42 75 69 6c 64 65 72 22 2f 3e 3c 2f  "SqlBuilder"/></
d160: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75  returns>..    pu
d170: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49 53  blic override IS
d180: 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74  qlFragment Visit
d190: 28 44 62 49 73 4f 66 45 78 70 72 65 73 73 69 6f  (DbIsOfExpressio
d1a0: 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n e)..    {..   
d1b0: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74     throw new Not
d1c0: 53 75 70 70 6f 72 74 65 64 45 78 63 65 70 74 69  SupportedExcepti
d1d0: 6f 6e 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  on();..    }....
d1e0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
d1f0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20  >..    /// <see 
d200: 63 72 65 66 3d 22 56 69 73 69 74 4a 6f 69 6e 45  cref="VisitJoinE
d210: 78 70 72 65 73 73 69 6f 6e 22 2f 3e 0d 0a 20 20  xpression"/>..  
d220: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
d230: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
d240: 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61   name="e"></para
d250: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
d260: 75 72 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66  urns>A <see cref
d270: 3d 22 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65  ="SqlSelectState
d280: 6d 65 6e 74 22 2f 3e 2e 3c 2f 72 65 74 75 72 6e  ment"/>.</return
d290: 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f  s>..    public o
d2a0: 76 65 72 72 69 64 65 20 49 53 71 6c 46 72 61 67  verride ISqlFrag
d2b0: 6d 65 6e 74 20 56 69 73 69 74 28 44 62 43 72 6f  ment Visit(DbCro
d2c0: 73 73 4a 6f 69 6e 45 78 70 72 65 73 73 69 6f 6e  ssJoinExpression
d2d0: 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20   e)..    {..    
d2e0: 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 4a 6f    return VisitJo
d2f0: 69 6e 45 78 70 72 65 73 73 69 6f 6e 28 65 2e 49  inExpression(e.I
d300: 6e 70 75 74 73 2c 20 65 2e 45 78 70 72 65 73 73  nputs, e.Express
d310: 69 6f 6e 4b 69 6e 64 2c 20 22 43 52 4f 53 53 20  ionKind, "CROSS 
d320: 4a 4f 49 4e 22 2c 20 6e 75 6c 6c 29 3b 0d 0a 20  JOIN", null);.. 
d330: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
d340: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
d350: 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69  // <see cref="Vi
d360: 73 69 74 4a 6f 69 6e 45 78 70 72 65 73 73 69 6f  sitJoinExpressio
d370: 6e 22 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  n"/>..    /// </
d380: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
d390: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65  / <param name="e
d3a0: 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  "></param>..    
d3b0: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 41 20 3c  /// <returns>A <
d3c0: 73 65 65 20 63 72 65 66 3d 22 53 71 6c 53 65 6c  see cref="SqlSel
d3d0: 65 63 74 53 74 61 74 65 6d 65 6e 74 22 2f 3e 2e  ectStatement"/>.
d3e0: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
d3f0: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
d400: 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73  ISqlFragment Vis
d410: 69 74 28 44 62 4a 6f 69 6e 45 78 70 72 65 73 73  it(DbJoinExpress
d420: 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20  ion e)..    {.. 
d430: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 4d 61 70       #region Map
d440: 20 6a 6f 69 6e 20 74 79 70 65 20 74 6f 20 61 20   join type to a 
d450: 73 74 72 69 6e 67 0d 0a 20 20 20 20 20 20 73 74  string..      st
d460: 72 69 6e 67 20 6a 6f 69 6e 53 74 72 69 6e 67 3b  ring joinString;
d470: 0d 0a 20 20 20 20 20 20 73 77 69 74 63 68 20 28  ..      switch (
d480: 65 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64  e.ExpressionKind
d490: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
d4a0: 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65      case DbExpre
d4b0: 73 73 69 6f 6e 4b 69 6e 64 2e 46 75 6c 6c 4f 75  ssionKind.FullOu
d4c0: 74 65 72 4a 6f 69 6e 3a 0d 0a 20 20 20 20 20 20  terJoin:..      
d4d0: 20 20 20 20 6a 6f 69 6e 53 74 72 69 6e 67 20 3d      joinString =
d4e0: 20 22 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49   "FULL OUTER JOI
d4f0: 4e 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  N";..          b
d500: 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  reak;....       
d510: 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73 69   case DbExpressi
d520: 6f 6e 4b 69 6e 64 2e 49 6e 6e 65 72 4a 6f 69 6e  onKind.InnerJoin
d530: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 6a 6f 69  :..          joi
d540: 6e 53 74 72 69 6e 67 20 3d 20 22 49 4e 4e 45 52  nString = "INNER
d550: 20 4a 4f 49 4e 22 3b 0d 0a 20 20 20 20 20 20 20   JOIN";..       
d560: 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20     break;....   
d570: 20 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72       case DbExpr
d580: 65 73 73 69 6f 6e 4b 69 6e 64 2e 4c 65 66 74 4f  essionKind.LeftO
d590: 75 74 65 72 4a 6f 69 6e 3a 0d 0a 20 20 20 20 20  uterJoin:..     
d5a0: 20 20 20 20 20 6a 6f 69 6e 53 74 72 69 6e 67 20       joinString 
d5b0: 3d 20 22 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  = "LEFT OUTER JO
d5c0: 49 4e 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  IN";..          
d5d0: 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20  break;....      
d5e0: 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20 20    default:..    
d5f0: 20 20 20 20 20 20 44 65 62 75 67 2e 41 73 73 65        Debug.Asse
d600: 72 74 28 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20  rt(false);..    
d610: 20 20 20 20 20 20 6a 6f 69 6e 53 74 72 69 6e 67        joinString
d620: 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20   = null;..      
d630: 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
d640: 20 20 7d 0d 0a 20 20 20 20 20 20 23 65 6e 64 72    }..      #endr
d650: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 4c  egion....      L
d660: 69 73 74 3c 44 62 45 78 70 72 65 73 73 69 6f 6e  ist<DbExpression
d670: 42 69 6e 64 69 6e 67 3e 20 69 6e 70 75 74 73 20  Binding> inputs 
d680: 3d 20 6e 65 77 20 4c 69 73 74 3c 44 62 45 78 70  = new List<DbExp
d690: 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 3e 28  ressionBinding>(
d6a0: 32 29 3b 0d 0a 20 20 20 20 20 20 69 6e 70 75 74  2);..      input
d6b0: 73 2e 41 64 64 28 65 2e 4c 65 66 74 29 3b 0d 0a  s.Add(e.Left);..
d6c0: 20 20 20 20 20 20 69 6e 70 75 74 73 2e 41 64 64        inputs.Add
d6d0: 28 65 2e 52 69 67 68 74 29 3b 0d 0a 0d 0a 20 20  (e.Right);....  
d6e0: 20 20 20 20 72 65 74 75 72 6e 20 56 69 73 69 74      return Visit
d6f0: 4a 6f 69 6e 45 78 70 72 65 73 73 69 6f 6e 28 69  JoinExpression(i
d700: 6e 70 75 74 73 2c 20 65 2e 45 78 70 72 65 73 73  nputs, e.Express
d710: 69 6f 6e 4b 69 6e 64 2c 20 6a 6f 69 6e 53 74 72  ionKind, joinStr
d720: 69 6e 67 2c 20 65 2e 4a 6f 69 6e 43 6f 6e 64 69  ing, e.JoinCondi
d730: 74 69 6f 6e 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  tion);..    }...
d740: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
d750: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20  y>..    ///..   
d760: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
d770: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
d780: 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d  name="e"></param
d790: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
d7a0: 72 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d  rns>A <see cref=
d7b0: 22 53 71 6c 42 75 69 6c 64 65 72 22 2f 3e 3c 2f  "SqlBuilder"/></
d7c0: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75  returns>..    pu
d7d0: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49 53  blic override IS
d7e0: 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74  qlFragment Visit
d7f0: 28 44 62 4c 69 6b 65 45 78 70 72 65 73 73 69 6f  (DbLikeExpressio
d800: 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n e)..    {..   
d810: 20 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72 65     SqlBuilder re
d820: 73 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42 75  sult = new SqlBu
d830: 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20 20  ilder();..      
d840: 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e  result.Append(e.
d850: 41 72 67 75 6d 65 6e 74 2e 41 63 63 65 70 74 28  Argument.Accept(
d860: 74 68 69 73 29 29 3b 0d 0a 20 20 20 20 20 20 72  this));..      r
d870: 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 20 4c  esult.Append(" L
d880: 49 4b 45 20 22 29 3b 0d 0a 20 20 20 20 20 20 72  IKE ");..      r
d890: 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e 50  esult.Append(e.P
d8a0: 61 74 74 65 72 6e 2e 41 63 63 65 70 74 28 74 68  attern.Accept(th
d8b0: 69 73 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f  is));....      /
d8c0: 2f 20 69 66 20 74 68 65 20 45 53 43 41 50 45 20  / if the ESCAPE 
d8d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
d8e0: 44 62 4e 75 6c 6c 45 78 70 72 65 73 73 69 6f 6e  DbNullExpression
d8f0: 2c 20 74 68 65 6e 20 74 68 61 74 27 73 20 74 61  , then that's ta
d900: 6e 74 61 6d 6f 75 6e 74 20 74 6f 0d 0a 20 20 20  ntamount to..   
d910: 20 20 20 2f 2f 20 6e 6f 74 20 68 61 76 69 6e 67     // not having
d920: 20 61 6e 20 45 53 43 41 50 45 20 61 74 20 61 6c   an ESCAPE at al
d930: 6c 0d 0a 20 20 20 20 20 20 69 66 20 28 65 2e 45  l..      if (e.E
d940: 73 63 61 70 65 2e 45 78 70 72 65 73 73 69 6f 6e  scape.Expression
d950: 4b 69 6e 64 20 21 3d 20 44 62 45 78 70 72 65 73  Kind != DbExpres
d960: 73 69 6f 6e 4b 69 6e 64 2e 4e 75 6c 6c 29 0d 0a  sionKind.Null)..
d970: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
d980: 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22   result.Append("
d990: 20 45 53 43 41 50 45 20 22 29 3b 0d 0a 20 20 20   ESCAPE ");..   
d9a0: 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
d9b0: 6e 64 28 65 2e 45 73 63 61 70 65 2e 41 63 63 65  nd(e.Escape.Acce
d9c0: 70 74 28 74 68 69 73 29 29 3b 0d 0a 20 20 20 20  pt(this));..    
d9d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
d9e0: 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20  urn result;..   
d9f0: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
da00: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
da10: 20 20 54 72 61 6e 73 6c 61 74 65 73 20 74 6f 20    Translates to 
da20: 54 4f 50 20 65 78 70 72 65 73 73 69 6f 6e 2e 0d  TOP expression..
da30: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
da40: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
da50: 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70  ram name="e"></p
da60: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
da70: 72 65 74 75 72 6e 73 3e 41 20 3c 73 65 65 20 63  returns>A <see c
da80: 72 65 66 3d 22 53 71 6c 42 75 69 6c 64 65 72 22  ref="SqlBuilder"
da90: 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  /></returns>..  
daa0: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
dab0: 65 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56  e ISqlFragment V
dac0: 69 73 69 74 28 44 62 4c 69 6d 69 74 45 78 70 72  isit(DbLimitExpr
dad0: 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b  ession e)..    {
dae0: 0d 0a 20 20 20 20 20 20 44 65 62 75 67 2e 41 73  ..      Debug.As
daf0: 73 65 72 74 28 65 2e 4c 69 6d 69 74 20 69 73 20  sert(e.Limit is 
db00: 44 62 43 6f 6e 73 74 61 6e 74 45 78 70 72 65 73  DbConstantExpres
db10: 73 69 6f 6e 20 7c 7c 20 65 2e 4c 69 6d 69 74 20  sion || e.Limit 
db20: 69 73 20 44 62 50 61 72 61 6d 65 74 65 72 52 65  is DbParameterRe
db30: 66 65 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f  ferenceExpressio
db40: 6e 2c 20 22 44 62 4c 69 6d 69 74 45 78 70 72 65  n, "DbLimitExpre
db50: 73 73 69 6f 6e 2e 4c 69 6d 69 74 20 69 73 20 6f  ssion.Limit is o
db60: 66 20 69 6e 76 61 6c 69 64 20 65 78 70 72 65 73  f invalid expres
db70: 73 69 6f 6e 20 74 79 70 65 22 29 3b 0d 0a 0d 0a  sion type");....
db80: 20 20 20 20 20 20 53 71 6c 53 65 6c 65 63 74 53        SqlSelectS
db90: 74 61 74 65 6d 65 6e 74 20 72 65 73 75 6c 74 20  tatement result 
dba0: 3d 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f  = VisitExpressio
dbb0: 6e 45 6e 73 75 72 65 53 71 6c 53 74 61 74 65 6d  nEnsureSqlStatem
dbc0: 65 6e 74 28 65 2e 41 72 67 75 6d 65 6e 74 2c 20  ent(e.Argument, 
dbd0: 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 53  false);..      S
dbe0: 79 6d 62 6f 6c 20 66 72 6f 6d 53 79 6d 62 6f 6c  ymbol fromSymbol
dbf0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 21  ;....      if (!
dc00: 49 73 43 6f 6d 70 61 74 69 62 6c 65 28 72 65 73  IsCompatible(res
dc10: 75 6c 74 2c 20 65 2e 45 78 70 72 65 73 73 69 6f  ult, e.Expressio
dc20: 6e 4b 69 6e 64 29 29 0d 0a 20 20 20 20 20 20 7b  nKind))..      {
dc30: 0d 0a 20 20 20 20 20 20 20 20 54 79 70 65 55 73  ..        TypeUs
dc40: 61 67 65 20 69 6e 70 75 74 54 79 70 65 20 3d 20  age inputType = 
dc50: 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e  MetadataHelpers.
dc60: 47 65 74 45 6c 65 6d 65 6e 74 54 79 70 65 55 73  GetElementTypeUs
dc70: 61 67 65 28 65 2e 41 72 67 75 6d 65 6e 74 2e 52  age(e.Argument.R
dc80: 65 73 75 6c 74 54 79 70 65 29 3b 0d 0a 0d 0a 20  esultType);.... 
dc90: 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20         result = 
dca0: 43 72 65 61 74 65 4e 65 77 53 65 6c 65 63 74 53  CreateNewSelectS
dcb0: 74 61 74 65 6d 65 6e 74 28 72 65 73 75 6c 74 2c  tatement(result,
dcc0: 20 22 74 6f 70 22 2c 20 69 6e 70 75 74 54 79 70   "top", inputTyp
dcd0: 65 2c 20 6f 75 74 20 66 72 6f 6d 53 79 6d 62 6f  e, out fromSymbo
dce0: 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 41 64 64  l);..        Add
dcf0: 46 72 6f 6d 53 79 6d 62 6f 6c 28 72 65 73 75 6c  FromSymbol(resul
dd00: 74 2c 20 22 74 6f 70 22 2c 20 66 72 6f 6d 53 79  t, "top", fromSy
dd10: 6d 62 6f 6c 2c 20 66 61 6c 73 65 29 3b 0d 0a 20  mbol, false);.. 
dd20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
dd30: 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 74 6f 70  ISqlFragment top
dd40: 43 6f 75 6e 74 20 3d 20 48 61 6e 64 6c 65 43 6f  Count = HandleCo
dd50: 75 6e 74 45 78 70 72 65 73 73 69 6f 6e 28 65 2e  untExpression(e.
dd60: 4c 69 6d 69 74 29 3b 0d 0a 0d 0a 20 20 20 20 20  Limit);....     
dd70: 20 72 65 73 75 6c 74 2e 54 6f 70 20 3d 20 6e 65   result.Top = ne
dd80: 77 20 54 6f 70 43 6c 61 75 73 65 28 74 6f 70 43  w TopClause(topC
dd90: 6f 75 6e 74 2c 20 65 2e 57 69 74 68 54 69 65 73  ount, e.WithTies
dda0: 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
ddb0: 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d   result;..    }.
ddc0: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
ddd0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 44 62  ary>..    /// Db
dde0: 4e 65 77 49 6e 73 74 61 6e 63 65 45 78 70 72 65  NewInstanceExpre
ddf0: 73 73 69 6f 6e 20 69 73 20 61 6c 6c 6f 77 65 64  ssion is allowed
de00: 20 61 73 20 61 20 63 68 69 6c 64 20 6f 66 20 44   as a child of D
de10: 62 50 72 6f 6a 65 63 74 45 78 70 72 65 73 73 69  bProjectExpressi
de20: 6f 6e 20 6f 6e 6c 79 2e 0d 0a 20 20 20 20 2f 2f  on only...    //
de30: 2f 20 49 66 20 61 6e 79 6f 6e 65 20 65 6c 73 65  / If anyone else
de40: 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 2c 20   is the parent, 
de50: 77 65 20 74 68 72 6f 77 2e 0d 0a 20 20 20 20 2f  we throw...    /
de60: 2f 2f 20 57 65 20 61 6c 73 6f 20 70 65 72 66 6f  // We also perfo
de70: 72 6d 20 73 70 65 63 69 61 6c 20 63 61 73 69 6e  rm special casin
de80: 67 20 66 6f 72 20 63 6f 6c 6c 65 63 74 69 6f 6e  g for collection
de90: 73 20 2d 20 77 68 65 72 65 20 77 65 20 63 6f 75  s - where we cou
dea0: 6c 64 20 63 6f 6e 76 65 72 74 0d 0a 20 20 20 20  ld convert..    
deb0: 2f 2f 2f 20 74 68 65 6d 20 69 6e 74 6f 20 55 6e  /// them into Un
dec0: 69 6f 6e 73 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20  ions..    ///.. 
ded0: 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66     /// <see cref
dee0: 3d 22 56 69 73 69 74 4e 65 77 49 6e 73 74 61 6e  ="VisitNewInstan
def0: 63 65 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e 20  ceExpression"/> 
df00: 66 6f 72 20 74 68 65 20 61 63 74 75 61 6c 20 69  for the actual i
df10: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a  mplementation...
df20: 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f      ///..    ///
df30: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
df40: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
df50: 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ="e"></param>.. 
df60: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
df70: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
df80: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
df90: 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73  ISqlFragment Vis
dfa0: 69 74 28 44 62 4e 65 77 49 6e 73 74 61 6e 63 65  it(DbNewInstance
dfb0: 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20  Expression e).. 
dfc0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 28     {..      if (
dfd0: 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e  MetadataHelpers.
dfe0: 49 73 43 6f 6c 6c 65 63 74 69 6f 6e 54 79 70 65  IsCollectionType
dff0: 28 65 2e 52 65 73 75 6c 74 54 79 70 65 29 29 0d  (e.ResultType)).
e000: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
e010: 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 43 6f    return VisitCo
e020: 6c 6c 65 63 74 69 6f 6e 43 6f 6e 73 74 72 75 63  llectionConstruc
e030: 74 6f 72 28 65 29 3b 0d 0a 20 20 20 20 20 20 7d  tor(e);..      }
e040: 0d 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65  ..      throw ne
e050: 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64 45 78  w NotSupportedEx
e060: 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20  ception();..    
e070: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
e080: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
e090: 54 68 65 20 4e 6f 74 20 65 78 70 72 65 73 73 69  The Not expressi
e0a0: 6f 6e 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  on may cause the
e0b0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 66 20   translation of 
e0c0: 69 74 73 20 63 68 69 6c 64 20 74 6f 20 63 68 61  its child to cha
e0d0: 6e 67 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  nge...    /// Th
e0e0: 65 73 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  ese children are
e0f0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 6c 69 73 74 20  ..    /// <list 
e100: 74 79 70 65 3d 22 62 75 6c 6c 65 74 22 3e 0d 0a  type="bullet">..
e110: 20 20 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 3c 73      /// <item><s
e120: 65 65 20 63 72 65 66 3d 22 44 62 4e 6f 74 45 78  ee cref="DbNotEx
e130: 70 72 65 73 73 69 6f 6e 22 2f 3e 4e 4f 54 28 4e  pression"/>NOT(N
e140: 6f 74 28 78 29 29 20 62 65 63 6f 6d 65 73 20 78  ot(x)) becomes x
e150: 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  </item>..    ///
e160: 20 3c 69 74 65 6d 3e 3c 73 65 65 20 63 72 65 66   <item><see cref
e170: 3d 22 44 62 49 73 45 6d 70 74 79 45 78 70 72 65  ="DbIsEmptyExpre
e180: 73 73 69 6f 6e 22 2f 3e 4e 4f 54 20 45 58 49 53  ssion"/>NOT EXIS
e190: 54 53 20 62 65 63 6f 6d 65 73 20 45 58 49 53 54  TS becomes EXIST
e1a0: 53 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f 2f  S</item>..    //
e1b0: 2f 20 3c 69 74 65 6d 3e 3c 73 65 65 20 63 72 65  / <item><see cre
e1c0: 66 3d 22 44 62 49 73 4e 75 6c 6c 45 78 70 72 65  f="DbIsNullExpre
e1d0: 73 73 69 6f 6e 22 2f 3e 49 53 20 4e 55 4c 4c 20  ssion"/>IS NULL 
e1e0: 62 65 63 6f 6d 65 73 20 49 53 20 4e 4f 54 20 4e  becomes IS NOT N
e1f0: 55 4c 4c 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20  ULL</item>..    
e200: 2f 2f 2f 20 3c 69 74 65 6d 3e 3c 73 65 65 20 63  /// <item><see c
e210: 72 65 66 3d 22 44 62 43 6f 6d 70 61 72 69 73 6f  ref="DbCompariso
e220: 6e 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e 3d 20  nExpression"/>= 
e230: 62 65 63 6f 6d 65 73 26 6c 74 3b 26 67 74 3b 20  becomes&lt;&gt; 
e240: 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  </item>..    ///
e250: 20 3c 2f 6c 69 73 74 3e 0d 0a 20 20 20 20 2f 2f   </list>..    //
e260: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
e270: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
e280: 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  e="e"></param>..
e290: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
e2a0: 3e 41 20 3c 73 65 65 20 63 72 65 66 3d 22 53 71  >A <see cref="Sq
e2b0: 6c 42 75 69 6c 64 65 72 22 2f 3e 3c 2f 72 65 74  lBuilder"/></ret
e2c0: 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69  urns>..    publi
e2d0: 63 20 6f 76 65 72 72 69 64 65 20 49 53 71 6c 46  c override ISqlF
e2e0: 72 61 67 6d 65 6e 74 20 56 69 73 69 74 28 44 62  ragment Visit(Db
e2f0: 4e 6f 74 45 78 70 72 65 73 73 69 6f 6e 20 65 29  NotExpression e)
e300: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 2f  ..    {..      /
e310: 2f 20 46 6c 61 74 74 65 6e 20 4e 6f 74 28 4e 6f  / Flatten Not(No
e320: 74 28 78 29 29 20 74 6f 20 78 2e 0d 0a 20 20 20  t(x)) to x...   
e330: 20 20 20 44 62 4e 6f 74 45 78 70 72 65 73 73 69     DbNotExpressi
e340: 6f 6e 20 6e 6f 74 45 78 70 72 65 73 73 69 6f 6e  on notExpression
e350: 20 3d 20 65 2e 41 72 67 75 6d 65 6e 74 20 61 73   = e.Argument as
e360: 20 44 62 4e 6f 74 45 78 70 72 65 73 73 69 6f 6e   DbNotExpression
e370: 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 6e 6f 74  ;..      if (not
e380: 45 78 70 72 65 73 73 69 6f 6e 20 21 3d 20 6e 75  Expression != nu
e390: 6c 6c 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ll)..      {..  
e3a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 6f 74        return not
e3b0: 45 78 70 72 65 73 73 69 6f 6e 2e 41 72 67 75 6d  Expression.Argum
e3c0: 65 6e 74 2e 41 63 63 65 70 74 28 74 68 69 73 29  ent.Accept(this)
e3d0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
e3e0: 20 20 20 20 44 62 49 73 45 6d 70 74 79 45 78 70      DbIsEmptyExp
e3f0: 72 65 73 73 69 6f 6e 20 69 73 45 6d 70 74 79 45  ression isEmptyE
e400: 78 70 72 65 73 73 69 6f 6e 20 3d 20 65 2e 41 72  xpression = e.Ar
e410: 67 75 6d 65 6e 74 20 61 73 20 44 62 49 73 45 6d  gument as DbIsEm
e420: 70 74 79 45 78 70 72 65 73 73 69 6f 6e 3b 0d 0a  ptyExpression;..
e430: 20 20 20 20 20 20 69 66 20 28 69 73 45 6d 70 74        if (isEmpt
e440: 79 45 78 70 72 65 73 73 69 6f 6e 20 21 3d 20 6e  yExpression != n
e450: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ull)..      {.. 
e460: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 56 69         return Vi
e470: 73 69 74 49 73 45 6d 70 74 79 45 78 70 72 65 73  sitIsEmptyExpres
e480: 73 69 6f 6e 28 69 73 45 6d 70 74 79 45 78 70 72  sion(isEmptyExpr
e490: 65 73 73 69 6f 6e 2c 20 74 72 75 65 29 3b 0d 0a  ession, true);..
e4a0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e4b0: 20 44 62 49 73 4e 75 6c 6c 45 78 70 72 65 73 73   DbIsNullExpress
e4c0: 69 6f 6e 20 69 73 4e 75 6c 6c 45 78 70 72 65 73  ion isNullExpres
e4d0: 73 69 6f 6e 20 3d 20 65 2e 41 72 67 75 6d 65 6e  sion = e.Argumen
e4e0: 74 20 61 73 20 44 62 49 73 4e 75 6c 6c 45 78 70  t as DbIsNullExp
e4f0: 72 65 73 73 69 6f 6e 3b 0d 0a 20 20 20 20 20 20  ression;..      
e500: 69 66 20 28 69 73 4e 75 6c 6c 45 78 70 72 65 73  if (isNullExpres
e510: 73 69 6f 6e 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  sion != null).. 
e520: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
e530: 72 65 74 75 72 6e 20 56 69 73 69 74 49 73 4e 75  return VisitIsNu
e540: 6c 6c 45 78 70 72 65 73 73 69 6f 6e 28 69 73 4e  llExpression(isN
e550: 75 6c 6c 45 78 70 72 65 73 73 69 6f 6e 2c 20 74  ullExpression, t
e560: 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  rue);..      }..
e570: 0d 0a 20 20 20 20 20 20 44 62 43 6f 6d 70 61 72  ..      DbCompar
e580: 69 73 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20 63  isonExpression c
e590: 6f 6d 70 61 72 69 73 6f 6e 45 78 70 72 65 73 73  omparisonExpress
e5a0: 69 6f 6e 20 3d 20 65 2e 41 72 67 75 6d 65 6e 74  ion = e.Argument
e5b0: 20 61 73 20 44 62 43 6f 6d 70 61 72 69 73 6f 6e   as DbComparison
e5c0: 45 78 70 72 65 73 73 69 6f 6e 3b 0d 0a 20 20 20  Expression;..   
e5d0: 20 20 20 69 66 20 28 63 6f 6d 70 61 72 69 73 6f     if (compariso
e5e0: 6e 45 78 70 72 65 73 73 69 6f 6e 20 21 3d 20 6e  nExpression != n
e5f0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ull)..      {.. 
e600: 20 20 20 20 20 20 20 69 66 20 28 63 6f 6d 70 61         if (compa
e610: 72 69 73 6f 6e 45 78 70 72 65 73 73 69 6f 6e 2e  risonExpression.
e620: 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 20 3d  ExpressionKind =
e630: 3d 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69  = DbExpressionKi
e640: 6e 64 2e 45 71 75 61 6c 73 29 0d 0a 20 20 20 20  nd.Equals)..    
e650: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
e660: 20 72 65 74 75 72 6e 20 56 69 73 69 74 42 69 6e   return VisitBin
e670: 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 22 20  aryExpression(" 
e680: 3c 3e 20 22 2c 20 63 6f 6d 70 61 72 69 73 6f 6e  <> ", comparison
e690: 45 78 70 72 65 73 73 69 6f 6e 2e 4c 65 66 74 2c  Expression.Left,
e6a0: 20 63 6f 6d 70 61 72 69 73 6f 6e 45 78 70 72 65   comparisonExpre
e6b0: 73 73 69 6f 6e 2e 52 69 67 68 74 29 3b 0d 0a 20  ssion.Right);.. 
e6c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
e6d0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 53 71 6c 42 75  }....      SqlBu
e6e0: 69 6c 64 65 72 20 72 65 73 75 6c 74 20 3d 20 6e  ilder result = n
e6f0: 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28 29 3b  ew SqlBuilder();
e700: 0d 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41  ..      result.A
e710: 70 70 65 6e 64 28 22 20 4e 4f 54 20 28 22 29 3b  ppend(" NOT (");
e720: 0d 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41  ..      result.A
e730: 70 70 65 6e 64 28 65 2e 41 72 67 75 6d 65 6e 74  ppend(e.Argument
e740: 2e 41 63 63 65 70 74 28 74 68 69 73 29 29 3b 0d  .Accept(this));.
e750: 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70  .      result.Ap
e760: 70 65 6e 64 28 22 29 22 29 3b 0d 0a 0d 0a 20 20  pend(")");....  
e770: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
e780: 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  t;..    }....   
e790: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
e7a0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
e7b0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  y>..    /// <par
e7c0: 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61  am name="e"></pa
e7d0: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
e7e0: 65 74 75 72 6e 73 3e 3c 73 65 65 20 63 72 65 66  eturns><see cref
e7f0: 3d 22 53 71 6c 42 75 69 6c 64 65 72 22 2f 3e 3c  ="SqlBuilder"/><
e800: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70  /returns>..    p
e810: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49  ublic override I
e820: 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69  SqlFragment Visi
e830: 74 28 44 62 4e 75 6c 6c 45 78 70 72 65 73 73 69  t(DbNullExpressi
e840: 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  on e)..    {..  
e850: 20 20 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72      SqlBuilder r
e860: 65 73 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42  esult = new SqlB
e870: 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20  uilder();..     
e880: 20 2f 2f 20 61 6c 77 61 79 73 20 63 61 73 74 20   // always cast 
e890: 6e 75 6c 6c 73 20 2d 20 73 71 6c 73 65 72 76 65  nulls - sqlserve
e8a0: 72 20 64 6f 65 73 6e 27 74 20 6c 69 6b 65 20 63  r doesn't like c
e8b0: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ase expressions 
e8c0: 77 68 65 72 65 20 74 68 65 20 22 74 68 65 6e 22  where the "then"
e8d0: 20 63 6c 61 75 73 65 20 69 73 20 6e 75 6c 6c 0d   clause is null.
e8e0: 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70  .      result.Ap
e8f0: 70 65 6e 64 28 22 4e 55 4c 4c 22 29 3b 0d 0a 20  pend("NULL");.. 
e900: 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75       return resu
e910: 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  lt;..    }....  
e920: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
e930: 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72  .    /// <see cr
e940: 65 66 3d 22 44 62 4f 66 54 79 70 65 45 78 70 72  ef="DbOfTypeExpr
e950: 65 73 73 69 6f 6e 22 2f 3e 20 69 73 20 69 6c 6c  ession"/> is ill
e960: 65 67 61 6c 20 61 74 20 74 68 69 73 20 73 74 61  egal at this sta
e970: 67 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ge..    /// </su
e980: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
e990: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e  <param name="e">
e9a0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
e9b0: 2f 20 3c 72 65 74 75 72 6e 73 3e 41 20 3c 73 65  / <returns>A <se
e9c0: 65 20 63 72 65 66 3d 22 53 71 6c 42 75 69 6c 64  e cref="SqlBuild
e9d0: 65 72 22 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d  er"/></returns>.
e9e0: 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
e9f0: 72 69 64 65 20 49 53 71 6c 46 72 61 67 6d 65 6e  ride ISqlFragmen
ea00: 74 20 56 69 73 69 74 28 44 62 4f 66 54 79 70 65  t Visit(DbOfType
ea10: 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20  Expression e).. 
ea20: 20 20 20 7b 0d 0a 20 20 20 20 20 20 74 68 72 6f     {..      thro
ea30: 77 20 6e 65 77 20 4e 6f 74 53 75 70 70 6f 72 74  w new NotSupport
ea40: 65 64 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a  edException();..
ea50: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
ea60: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
ea70: 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ///..    /// </s
ea80: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
ea90: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22   <param name="e"
eaa0: 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  ></param>..    /
eab0: 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 41 20 3c 73  // <returns>A <s
eac0: 65 65 20 63 72 65 66 3d 22 53 71 6c 42 75 69 6c  ee cref="SqlBuil
ead0: 64 65 72 22 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e  der"/></returns>
eae0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 61 6c  ..    /// <seeal
eaf0: 73 6f 20 63 72 65 66 3d 22 56 69 73 69 74 28 44  so cref="Visit(D
eb00: 62 41 6e 64 45 78 70 72 65 73 73 69 6f 6e 29 22  bAndExpression)"
eb10: 2f 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f  />..    public o
eb20: 76 65 72 72 69 64 65 20 49 53 71 6c 46 72 61 67  verride ISqlFrag
eb30: 6d 65 6e 74 20 56 69 73 69 74 28 44 62 4f 72 45  ment Visit(DbOrE
eb40: 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20  xpression e)..  
eb50: 20 20 7b 0d 0a 20 20 20 20 20 20 49 53 71 6c 46    {..      ISqlF
eb60: 72 61 67 6d 65 6e 74 20 73 71 6c 46 72 61 67 6d  ragment sqlFragm
eb70: 65 6e 74 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20  ent = null;..   
eb80: 20 20 20 69 66 20 28 74 68 69 73 2e 54 72 79 54     if (this.TryT
eb90: 72 61 6e 73 6c 61 74 65 49 6e 74 6f 49 6e 28 65  ranslateIntoIn(e
eba0: 2c 20 6f 75 74 20 73 71 6c 46 72 61 67 6d 65 6e  , out sqlFragmen
ebb0: 74 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  t))..      {..  
ebc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
ebd0: 46 72 61 67 6d 65 6e 74 3b 0d 0a 20 20 20 20 20  Fragment;..     
ebe0: 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   }..      return
ebf0: 20 56 69 73 69 74 42 69 6e 61 72 79 45 78 70 72   VisitBinaryExpr
ec00: 65 73 73 69 6f 6e 28 22 20 4f 52 20 22 2c 20 65  ession(" OR ", e
ec10: 2e 4c 65 66 74 2c 20 65 2e 52 69 67 68 74 29 3b  .Left, e.Right);
ec20: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
ec30: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
ec40: 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 3c    ///..    /// <
ec50: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
ec60: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
ec70: 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  e"></param>..   
ec80: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 41 20   /// <returns>A 
ec90: 3c 73 65 65 20 63 72 65 66 3d 22 53 71 6c 42 75  <see cref="SqlBu
eca0: 69 6c 64 65 72 22 2f 3e 3c 2f 72 65 74 75 72 6e  ilder"/></return
ecb0: 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f  s>..    public o
ecc0: 76 65 72 72 69 64 65 20 49 53 71 6c 46 72 61 67  verride ISqlFrag
ecd0: 6d 65 6e 74 20 56 69 73 69 74 28 44 62 50 61 72  ment Visit(DbPar
ece0: 61 6d 65 74 65 72 52 65 66 65 72 65 6e 63 65 45  ameterReferenceE
ecf0: 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20  xpression e)..  
ed00: 20 20 7b 0d 0a 20 20 20 20 20 20 53 71 6c 42 75    {..      SqlBu
ed10: 69 6c 64 65 72 20 72 65 73 75 6c 74 20 3d 20 6e  ilder result = n
ed20: 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28 29 3b  ew SqlBuilder();
ed30: 0d 0a 20 20 20 20 20 20 2f 2f 20 44 6f 20 6e 6f  ..      // Do no
ed40: 74 20 71 75 6f 74 65 20 74 68 69 73 20 6e 61 6d  t quote this nam
ed50: 65 2e 0d 0a 20 20 20 20 20 20 2f 2f 20 57 65 20  e...      // We 
ed60: 61 72 65 20 6e 6f 74 20 63 68 65 63 6b 69 6e 67  are not checking
ed70: 20 74 68 61 74 20 65 2e 4e 61 6d 65 20 68 61 73   that e.Name has
ed80: 20 6e 6f 20 69 6c 6c 65 67 61 6c 20 63 68 61 72   no illegal char
ed90: 61 63 74 65 72 73 2e 20 65 2e 67 2e 20 73 70 61  acters. e.g. spa
eda0: 63 65 0d 0a 20 20 20 20 20 20 72 65 73 75 6c 74  ce..      result
edb0: 2e 41 70 70 65 6e 64 28 22 40 22 20 2b 20 65 2e  .Append("@" + e.
edc0: 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 29 3b 0d  ParameterName);.
edd0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
ede0: 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a  result;..    }..
edf0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
ee00: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 65  ry>..    /// <se
ee10: 65 20 63 72 65 66 3d 22 56 69 73 69 74 28 44 62  e cref="Visit(Db
ee20: 46 69 6c 74 65 72 45 78 70 72 65 73 73 69 6f 6e  FilterExpression
ee30: 29 22 2f 3e 20 66 6f 72 20 74 68 65 20 67 65 6e  )"/> for the gen
ee40: 65 72 61 6c 20 69 64 65 61 73 2e 0d 0a 20 20 20  eral ideas...   
ee50: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
ee60: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
ee70: 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d  name="e"></param
ee80: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
ee90: 72 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d  rns>A <see cref=
eea0: 22 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d  "SqlSelectStatem
eeb0: 65 6e 74 22 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e  ent"/></returns>
eec0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 61 6c  ..    /// <seeal
eed0: 73 6f 20 63 72 65 66 3d 22 56 69 73 69 74 28 44  so cref="Visit(D
eee0: 62 46 69 6c 74 65 72 45 78 70 72 65 73 73 69 6f  bFilterExpressio
eef0: 6e 29 22 2f 3e 0d 0a 20 20 20 20 70 75 62 6c 69  n)"/>..    publi
ef00: 63 20 6f 76 65 72 72 69 64 65 20 49 53 71 6c 46  c override ISqlF
ef10: 72 61 67 6d 65 6e 74 20 56 69 73 69 74 28 44 62  ragment Visit(Db
ef20: 50 72 6f 6a 65 63 74 45 78 70 72 65 73 73 69 6f  ProjectExpressio
ef30: 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n e)..    {..   
ef40: 20 20 20 53 79 6d 62 6f 6c 20 66 72 6f 6d 53 79     Symbol fromSy
ef50: 6d 62 6f 6c 3b 0d 0a 20 20 20 20 20 20 53 71 6c  mbol;..      Sql
ef60: 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 20  SelectStatement 
ef70: 72 65 73 75 6c 74 20 3d 20 56 69 73 69 74 49 6e  result = VisitIn
ef80: 70 75 74 45 78 70 72 65 73 73 69 6f 6e 28 65 2e  putExpression(e.
ef90: 49 6e 70 75 74 2e 45 78 70 72 65 73 73 69 6f 6e  Input.Expression
efa0: 2c 20 65 2e 49 6e 70 75 74 2e 56 61 72 69 61 62  , e.Input.Variab
efb0: 6c 65 4e 61 6d 65 2c 20 65 2e 49 6e 70 75 74 2e  leName, e.Input.
efc0: 56 61 72 69 61 62 6c 65 54 79 70 65 2c 20 6f 75  VariableType, ou
efd0: 74 20 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a  t fromSymbol);..
efe0: 0d 0a 20 20 20 20 20 20 2f 2f 20 50 72 6f 6a 65  ..      // Proje
eff0: 63 74 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  ct is compatible
f000: 20 77 69 74 68 20 46 69 6c 74 65 72 0d 0a 20 20   with Filter..  
f010: 20 20 20 20 2f 2f 20 62 75 74 20 6e 6f 74 20 77      // but not w
f020: 69 74 68 20 50 72 6f 6a 65 63 74 2c 20 47 72 6f  ith Project, Gro
f030: 75 70 42 79 0d 0a 20 20 20 20 20 20 69 66 20 28  upBy..      if (
f040: 21 49 73 43 6f 6d 70 61 74 69 62 6c 65 28 72 65  !IsCompatible(re
f050: 73 75 6c 74 2c 20 65 2e 45 78 70 72 65 73 73 69  sult, e.Expressi
f060: 6f 6e 4b 69 6e 64 29 29 0d 0a 20 20 20 20 20 20  onKind))..      
f070: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  {..        resul
f080: 74 20 3d 20 43 72 65 61 74 65 4e 65 77 53 65 6c  t = CreateNewSel
f090: 65 63 74 53 74 61 74 65 6d 65 6e 74 28 72 65 73  ectStatement(res
f0a0: 75 6c 74 2c 20 65 2e 49 6e 70 75 74 2e 56 61 72  ult, e.Input.Var
f0b0: 69 61 62 6c 65 4e 61 6d 65 2c 20 65 2e 49 6e 70  iableName, e.Inp
f0c0: 75 74 2e 56 61 72 69 61 62 6c 65 54 79 70 65 2c  ut.VariableType,
f0d0: 20 6f 75 74 20 66 72 6f 6d 53 79 6d 62 6f 6c 29   out fromSymbol)
f0e0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
f0f0: 20 20 20 20 73 65 6c 65 63 74 53 74 61 74 65 6d      selectStatem
f100: 65 6e 74 53 74 61 63 6b 2e 50 75 73 68 28 72 65  entStack.Push(re
f110: 73 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20 73 79  sult);..      sy
f120: 6d 62 6f 6c 54 61 62 6c 65 2e 45 6e 74 65 72 53  mbolTable.EnterS
f130: 63 6f 70 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  cope();....     
f140: 20 41 64 64 46 72 6f 6d 53 79 6d 62 6f 6c 28 72   AddFromSymbol(r
f150: 65 73 75 6c 74 2c 20 65 2e 49 6e 70 75 74 2e 56  esult, e.Input.V
f160: 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20 66 72 6f  ariableName, fro
f170: 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 0d 0a 20 20 20  mSymbol);....   
f180: 20 20 20 2f 2f 20 50 72 6f 6a 65 63 74 20 69 73     // Project is
f190: 20 74 68 65 20 6f 6e 6c 79 20 6e 6f 64 65 20 74   the only node t
f1a0: 68 61 74 20 63 61 6e 20 68 61 76 65 20 44 62 4e  hat can have DbN
f1b0: 65 77 49 6e 73 74 61 6e 63 65 45 78 70 72 65 73  ewInstanceExpres
f1c0: 73 69 6f 6e 20 61 73 20 61 20 63 68 69 6c 64 0d  sion as a child.
f1d0: 0a 20 20 20 20 20 20 2f 2f 20 73 6f 20 77 65 20  .      // so we 
f1e0: 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 69 74  have to check it
f1f0: 20 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 2f 2f   here...      //
f200: 20 57 65 20 63 61 6c 6c 20 56 69 73 69 74 4e 65   We call VisitNe
f210: 77 49 6e 73 74 61 6e 63 65 45 78 70 72 65 73 73  wInstanceExpress
f220: 69 6f 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 56  ion instead of V
f230: 69 73 69 74 28 44 62 4e 65 77 49 6e 73 74 61 6e  isit(DbNewInstan
f240: 63 65 45 78 70 72 65 73 73 69 6f 6e 29 2c 20 73  ceExpression), s
f250: 69 6e 63 65 0d 0a 20 20 20 20 20 20 2f 2f 20 74  ince..      // t
f260: 68 65 20 6c 61 74 74 65 72 20 74 68 72 6f 77 73  he latter throws
f270: 2e 0d 0a 20 20 20 20 20 20 44 62 4e 65 77 49 6e  ...      DbNewIn
f280: 73 74 61 6e 63 65 45 78 70 72 65 73 73 69 6f 6e  stanceExpression
f290: 20 6e 65 77 49 6e 73 74 61 6e 63 65 45 78 70 72   newInstanceExpr
f2a0: 65 73 73 69 6f 6e 20 3d 20 65 2e 50 72 6f 6a 65  ession = e.Proje
f2b0: 63 74 69 6f 6e 20 61 73 20 44 62 4e 65 77 49 6e  ction as DbNewIn
f2c0: 73 74 61 6e 63 65 45 78 70 72 65 73 73 69 6f 6e  stanceExpression
f2d0: 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 6e 65 77  ;..      if (new
f2e0: 49 6e 73 74 61 6e 63 65 45 78 70 72 65 73 73 69  InstanceExpressi
f2f0: 6f 6e 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  on != null)..   
f300: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65     {..        re
f310: 73 75 6c 74 2e 53 65 6c 65 63 74 2e 41 70 70 65  sult.Select.Appe
f320: 6e 64 28 56 69 73 69 74 4e 65 77 49 6e 73 74 61  nd(VisitNewInsta
f330: 6e 63 65 45 78 70 72 65 73 73 69 6f 6e 28 6e 65  nceExpression(ne
f340: 77 49 6e 73 74 61 6e 63 65 45 78 70 72 65 73 73  wInstanceExpress
f350: 69 6f 6e 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ion));..      }.
f360: 0a 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20  .      else..   
f370: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65     {..        re
f380: 73 75 6c 74 2e 53 65 6c 65 63 74 2e 41 70 70 65  sult.Select.Appe
f390: 6e 64 28 65 2e 50 72 6f 6a 65 63 74 69 6f 6e 2e  nd(e.Projection.
f3a0: 41 63 63 65 70 74 28 74 68 69 73 29 29 3b 0d 0a  Accept(this));..
f3b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f3c0: 20 73 79 6d 62 6f 6c 54 61 62 6c 65 2e 45 78 69   symbolTable.Exi
f3d0: 74 53 63 6f 70 65 28 29 3b 0d 0a 20 20 20 20 20  tScope();..     
f3e0: 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74   selectStatement
f3f0: 53 74 61 63 6b 2e 50 6f 70 28 29 3b 0d 0a 0d 0a  Stack.Pop();....
f400: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73        return res
f410: 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ult;..    }.... 
f420: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
f430: 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d  ..    /// This m
f440: 65 74 68 6f 64 20 68 61 6e 64 6c 65 73 20 72 65  ethod handles re
f450: 63 6f 72 64 20 66 6c 61 74 74 65 6e 69 6e 67 2c  cord flattening,
f460: 20 77 68 69 63 68 20 77 6f 72 6b 73 20 61 73 20   which works as 
f470: 66 6f 6c 6c 6f 77 73 2e 0d 0a 20 20 20 20 2f 2f  follows...    //
f480: 2f 20 63 6f 6e 73 69 64 65 72 20 61 6e 20 65 78  / consider an ex
f490: 70 72 65 73 73 69 6f 6e 20 3c 63 3e 50 72 6f 70  pression <c>Prop
f4a0: 28 79 2c 20 50 72 6f 70 28 78 2c 20 50 72 6f 70  (y, Prop(x, Prop
f4b0: 28 64 2c 20 50 72 6f 70 28 63 2c 20 50 72 6f 70  (d, Prop(c, Prop
f4c0: 28 62 2c 20 56 61 72 28 61 29 29 29 29 29 3c 2f  (b, Var(a)))))</
f4d0: 63 3e 0d 0a 20 20 20 20 2f 2f 2f 20 77 68 65 72  c>..    /// wher
f4e0: 65 20 61 2c 62 2c 63 20 61 72 65 20 6a 6f 69 6e  e a,b,c are join
f4f0: 73 2c 20 64 20 69 73 20 61 6e 20 65 78 74 65 6e  s, d is an exten
f500: 74 20 61 6e 64 20 78 20 61 6e 64 20 79 20 61 72  t and x and y ar
f510: 65 20 66 69 65 6c 64 73 2e 0d 0a 20 20 20 20 2f  e fields...    /
f520: 2f 2f 20 62 20 68 61 73 20 62 65 65 6e 20 66 6c  // b has been fl
f530: 61 74 74 65 6e 65 64 20 69 6e 74 6f 20 61 2c 20  attened into a, 
f540: 61 6e 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20  and has its own 
f550: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f560: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 63 20 68 61 73  ...    /// c has
f570: 20 62 65 65 6e 20 66 6c 61 74 74 65 6e 65 64 20   been flattened 
f580: 69 6e 74 6f 20 62 2e 0d 0a 20 20 20 20 2f 2f 2f  into b...    ///
f590: 20 64 20 68 61 73 20 62 65 65 6e 20 66 6c 61 74   d has been flat
f5a0: 74 65 6e 65 64 20 69 6e 74 6f 20 63 2e 0d 0a 20  tened into c... 
f5b0: 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20     ///..    /// 
f5c0: 57 65 20 76 69 73 69 74 20 74 68 65 20 69 6e 73  We visit the ins
f5d0: 74 61 6e 63 65 2c 20 73 6f 20 77 65 20 72 65 61  tance, so we rea
f5e0: 63 68 20 56 61 72 28 61 29 20 66 69 72 73 74 2e  ch Var(a) first.
f5f0: 20 20 54 68 69 73 20 67 69 76 65 73 20 75 73 20    This gives us 
f600: 61 20 28 6a 6f 69 6e 29 73 79 6d 62 6f 6c 2e 0d  a (join)symbol..
f610: 0a 20 20 20 20 2f 2f 2f 20 53 79 6d 62 6f 6c 28  .    /// Symbol(
f620: 61 29 2e 62 20 67 69 76 65 73 20 75 73 20 61 20  a).b gives us a 
f630: 6a 6f 69 6e 20 73 79 6d 62 6f 6c 2c 20 77 69 74  join symbol, wit
f640: 68 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  h a SELECT state
f650: 6d 65 6e 74 20 69 2e 65 2e 20 53 79 6d 62 6f 6c  ment i.e. Symbol
f660: 28 62 29 2e 0d 0a 20 20 20 20 2f 2f 2f 20 46 72  (b)...    /// Fr
f670: 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e  om this point on
f680: 20 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65   , we need to re
f690: 6d 65 6d 62 65 72 20 53 79 6d 62 6f 6c 28 62 29  member Symbol(b)
f6a0: 20 61 73 20 74 68 65 20 73 6f 75 72 63 65 20 61   as the source a
f6b0: 6c 69 61 73 2c 0d 0a 20 20 20 20 2f 2f 2f 20 61  lias,..    /// a
f6c0: 6e 64 20 74 68 65 6e 20 74 72 79 20 74 6f 20 66  nd then try to f
f6d0: 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20  ind the column. 
f6e0: 20 53 6f 2c 20 77 65 20 75 73 65 20 61 20 53 79   So, we use a Sy
f6f0: 6d 62 6f 6c 50 61 69 72 2e 0d 0a 20 20 20 20 2f  mbolPair...    /
f700: 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 57 65 20 68  //..    /// We h
f710: 61 76 65 20 72 65 61 63 68 65 64 20 74 68 65 20  ave reached the 
f720: 65 6e 64 20 77 68 65 6e 20 74 68 65 20 73 79 6d  end when the sym
f730: 62 6f 6c 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 6f  bol no longer po
f740: 69 6e 74 73 20 74 6f 20 61 20 6a 6f 69 6e 20 73  ints to a join s
f750: 79 6d 62 6f 6c 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ymbol...    /// 
f760: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
f770: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
f780: 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  "e"></param>..  
f790: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 41    /// <returns>A
f7a0: 20 3c 73 65 65 20 63 72 65 66 3d 22 4a 6f 69 6e   <see cref="Join
f7b0: 53 79 6d 62 6f 6c 22 2f 3e 20 69 66 20 77 65 20  Symbol"/> if we 
f7c0: 68 61 76 65 20 6e 6f 74 20 72 65 61 63 68 65 64  have not reached
f7d0: 20 74 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20   the first..    
f7e0: 2f 2f 2f 20 4a 6f 69 6e 20 6e 6f 64 65 20 74 68  /// Join node th
f7f0: 61 74 20 68 61 73 20 61 20 53 45 4c 45 43 54 20  at has a SELECT 
f800: 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20  statement...    
f810: 2f 2f 2f 20 41 20 3c 73 65 65 20 63 72 65 66 3d  /// A <see cref=
f820: 22 53 79 6d 62 6f 6c 50 61 69 72 22 2f 3e 20 69  "SymbolPair"/> i
f830: 66 20 77 65 20 68 61 76 65 20 73 65 65 6e 20 74  f we have seen t
f840: 68 65 20 4a 6f 69 6e 4e 6f 64 65 2c 20 61 6e 64  he JoinNode, and
f850: 20 69 74 20 68 61 73 0d 0a 20 20 20 20 2f 2f 2f   it has..    ///
f860: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
f870: 65 6e 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 41 20  ent...    /// A 
f880: 3c 73 65 65 20 63 72 65 66 3d 22 53 71 6c 42 75  <see cref="SqlBu
f890: 69 6c 64 65 72 22 2f 3e 20 77 69 74 68 20 7b 49  ilder"/> with {I
f8a0: 6e 70 75 74 7d 2e 70 72 6f 70 65 72 74 79 4e 61  nput}.propertyNa
f8b0: 6d 65 20 6f 74 68 65 72 77 69 73 65 2e 0d 0a 20  me otherwise... 
f8c0: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
f8d0: 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  >..    public ov
f8e0: 65 72 72 69 64 65 20 49 53 71 6c 46 72 61 67 6d  erride ISqlFragm
f8f0: 65 6e 74 20 56 69 73 69 74 28 44 62 50 72 6f 70  ent Visit(DbProp
f900: 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e 20 65  ertyExpression e
f910: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
f920: 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c  SqlBuilder resul
f930: 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 49 53 71 6c  t;....      ISql
f940: 46 72 61 67 6d 65 6e 74 20 69 6e 73 74 61 6e 63  Fragment instanc
f950: 65 53 71 6c 20 3d 20 65 2e 49 6e 73 74 61 6e 63  eSql = e.Instanc
f960: 65 2e 41 63 63 65 70 74 28 74 68 69 73 29 3b 0d  e.Accept(this);.
f970: 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 53 69 6e 63  ...      // Sinc
f980: 65 20 74 68 65 20 44 62 56 61 72 69 61 62 6c 65  e the DbVariable
f990: 52 65 66 65 72 65 6e 63 65 45 78 70 72 65 73 73  ReferenceExpress
f9a0: 69 6f 6e 20 69 73 20 61 20 70 72 6f 70 65 72 20  ion is a proper 
f9b0: 63 68 69 6c 64 20 6f 66 20 6f 75 72 73 2c 20 77  child of ours, w
f9c0: 65 20 63 61 6e 20 72 65 73 65 74 0d 0a 20 20 20  e can reset..   
f9d0: 20 20 20 2f 2f 20 69 73 56 61 72 53 69 6e 67 6c     // isVarSingl
f9e0: 65 2e 0d 0a 20 20 20 20 20 20 44 62 56 61 72 69  e...      DbVari
f9f0: 61 62 6c 65 52 65 66 65 72 65 6e 63 65 45 78 70  ableReferenceExp
fa00: 72 65 73 73 69 6f 6e 20 44 62 56 61 72 69 61 62  ression DbVariab
fa10: 6c 65 52 65 66 65 72 65 6e 63 65 45 78 70 72 65  leReferenceExpre
fa20: 73 73 69 6f 6e 20 3d 20 65 2e 49 6e 73 74 61 6e  ssion = e.Instan
fa30: 63 65 20 61 73 20 44 62 56 61 72 69 61 62 6c 65  ce as DbVariable
fa40: 52 65 66 65 72 65 6e 63 65 45 78 70 72 65 73 73  ReferenceExpress
fa50: 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 69 66 20 28  ion;..      if (
fa60: 44 62 56 61 72 69 61 62 6c 65 52 65 66 65 72 65  DbVariableRefere
fa70: 6e 63 65 45 78 70 72 65 73 73 69 6f 6e 20 21 3d  nceExpression !=
fa80: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 7b 0d   null)..      {.
fa90: 0a 20 20 20 20 20 20 20 20 69 73 56 61 72 52 65  .        isVarRe
faa0: 66 53 69 6e 67 6c 65 20 3d 20 66 61 6c 73 65 3b  fSingle = false;
fab0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
fac0: 20 20 20 2f 2f 20 57 65 20 6e 65 65 64 20 74 6f     // We need to
fad0: 20 66 6c 61 74 74 65 6e 2c 20 61 6e 64 20 68 61   flatten, and ha
fae0: 76 65 20 6e 6f 74 20 79 65 74 20 73 65 65 6e 20  ve not yet seen 
faf0: 74 68 65 20 66 69 72 73 74 20 6e 65 73 74 65 64  the first nested
fb00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fb10: 74 2e 0d 0a 20 20 20 20 20 20 4a 6f 69 6e 53 79  t...      JoinSy
fb20: 6d 62 6f 6c 20 6a 6f 69 6e 53 79 6d 62 6f 6c 20  mbol joinSymbol 
fb30: 3d 20 69 6e 73 74 61 6e 63 65 53 71 6c 20 61 73  = instanceSql as
fb40: 20 4a 6f 69 6e 53 79 6d 62 6f 6c 3b 0d 0a 20 20   JoinSymbol;..  
fb50: 20 20 20 20 69 66 20 28 6a 6f 69 6e 53 79 6d 62      if (joinSymb
fb60: 6f 6c 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ol != null)..   
fb70: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 44 65     {..        De
fb80: 62 75 67 2e 41 73 73 65 72 74 28 6a 6f 69 6e 53  bug.Assert(joinS
fb90: 79 6d 62 6f 6c 2e 4e 61 6d 65 54 6f 45 78 74 65  ymbol.NameToExte
fba0: 6e 74 2e 43 6f 6e 74 61 69 6e 73 4b 65 79 28 65  nt.ContainsKey(e
fbb0: 2e 50 72 6f 70 65 72 74 79 2e 4e 61 6d 65 29 29  .Property.Name))
fbc0: 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 6a  ;..        if (j
fbd0: 6f 69 6e 53 79 6d 62 6f 6c 2e 49 73 4e 65 73 74  oinSymbol.IsNest
fbe0: 65 64 4a 6f 69 6e 29 0d 0a 20 20 20 20 20 20 20  edJoin)..       
fbf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
fc00: 74 75 72 6e 20 6e 65 77 20 53 79 6d 62 6f 6c 50  turn new SymbolP
fc10: 61 69 72 28 6a 6f 69 6e 53 79 6d 62 6f 6c 2c 20  air(joinSymbol, 
fc20: 6a 6f 69 6e 53 79 6d 62 6f 6c 2e 4e 61 6d 65 54  joinSymbol.NameT
fc30: 6f 45 78 74 65 6e 74 5b 65 2e 50 72 6f 70 65 72  oExtent[e.Proper
fc40: 74 79 2e 4e 61 6d 65 5d 29 3b 0d 0a 20 20 20 20  ty.Name]);..    
fc50: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 65      }..        e
fc60: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  lse..        {..
fc70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
fc80: 20 6a 6f 69 6e 53 79 6d 62 6f 6c 2e 4e 61 6d 65   joinSymbol.Name
fc90: 54 6f 45 78 74 65 6e 74 5b 65 2e 50 72 6f 70 65  ToExtent[e.Prope
fca0: 72 74 79 2e 4e 61 6d 65 5d 3b 0d 0a 20 20 20 20  rty.Name];..    
fcb0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
fcc0: 0d 0a 20 20 20 20 20 20 2f 2f 20 2d 2d 2d 2d 2d  ..      // -----
fcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcf0: 2d 2d 0d 0a 20 20 20 20 20 20 2f 2f 20 57 65 20  --..      // We 
fd00: 68 61 76 65 20 73 65 65 6e 20 74 68 65 20 66 69  have seen the fi
fd10: 72 73 74 20 6e 65 73 74 65 64 20 53 45 4c 45 43  rst nested SELEC
fd20: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  T statement, but
fd30: 20 6e 6f 74 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   not the column.
fd40: 0d 0a 20 20 20 20 20 20 53 79 6d 62 6f 6c 50 61  ..      SymbolPa
fd50: 69 72 20 73 79 6d 62 6f 6c 50 61 69 72 20 3d 20  ir symbolPair = 
fd60: 69 6e 73 74 61 6e 63 65 53 71 6c 20 61 73 20 53  instanceSql as S
fd70: 79 6d 62 6f 6c 50 61 69 72 3b 0d 0a 20 20 20 20  ymbolPair;..    
fd80: 20 20 69 66 20 28 73 79 6d 62 6f 6c 50 61 69 72    if (symbolPair
fd90: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
fda0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 4a 6f 69 6e   {..        Join
fdb0: 53 79 6d 62 6f 6c 20 63 6f 6c 75 6d 6e 4a 6f 69  Symbol columnJoi
fdc0: 6e 53 79 6d 62 6f 6c 20 3d 20 73 79 6d 62 6f 6c  nSymbol = symbol
fdd0: 50 61 69 72 2e 43 6f 6c 75 6d 6e 20 61 73 20 4a  Pair.Column as J
fde0: 6f 69 6e 53 79 6d 62 6f 6c 3b 0d 0a 20 20 20 20  oinSymbol;..    
fdf0: 20 20 20 20 69 66 20 28 63 6f 6c 75 6d 6e 4a 6f      if (columnJo
fe00: 69 6e 53 79 6d 62 6f 6c 20 21 3d 20 6e 75 6c 6c  inSymbol != null
fe10: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
fe20: 20 20 20 20 20 20 20 20 73 79 6d 62 6f 6c 50 61          symbolPa
fe30: 69 72 2e 43 6f 6c 75 6d 6e 20 3d 20 63 6f 6c 75  ir.Column = colu
fe40: 6d 6e 4a 6f 69 6e 53 79 6d 62 6f 6c 2e 4e 61 6d  mnJoinSymbol.Nam
fe50: 65 54 6f 45 78 74 65 6e 74 5b 65 2e 50 72 6f 70  eToExtent[e.Prop
fe60: 65 72 74 79 2e 4e 61 6d 65 5d 3b 0d 0a 20 20 20  erty.Name];..   
fe70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 79         return sy
fe80: 6d 62 6f 6c 50 61 69 72 3b 0d 0a 20 20 20 20 20  mbolPair;..     
fe90: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 65 6c     }..        el
fea0: 73 65 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  se..        {.. 
feb0: 20 20 20 20 20 20 20 20 20 2f 2f 20 73 79 6d 62           // symb
fec0: 6f 6c 50 61 69 72 2e 43 6f 6c 75 6d 6e 20 68 61  olPair.Column ha
fed0: 73 20 74 68 65 20 62 61 73 65 20 65 78 74 65 6e  s the base exten
fee0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  t...          //
fef0: 20 77 65 20 6e 65 65 64 20 74 68 65 20 73 79 6d   we need the sym
ff00: 62 6f 6c 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  bol for the colu
ff10: 6d 6e 2c 20 73 69 6e 63 65 20 69 74 20 6d 69 67  mn, since it mig
ff20: 68 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 6e  ht have been ren
ff30: 61 6d 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  amed..          
ff40: 2f 2f 20 77 68 65 6e 20 68 61 6e 64 6c 69 6e 67  // when handling
ff50: 20 61 20 4a 4f 49 4e 2e 0d 0a 20 20 20 20 20 20   a JOIN...      
ff60: 20 20 20 20 69 66 20 28 73 79 6d 62 6f 6c 50 61      if (symbolPa
ff70: 69 72 2e 43 6f 6c 75 6d 6e 2e 43 6f 6c 75 6d 6e  ir.Column.Column
ff80: 73 2e 43 6f 6e 74 61 69 6e 73 4b 65 79 28 65 2e  s.ContainsKey(e.
ff90: 50 72 6f 70 65 72 74 79 2e 4e 61 6d 65 29 29 0d  Property.Name)).
ffa0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
ffb0: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
ffc0: 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64 65   = new SqlBuilde
ffd0: 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  r();..          
ffe0: 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
fff0: 73 79 6d 62 6f 6c 50 61 69 72 2e 53 6f 75 72 63  symbolPair.Sourc
10000 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
10010 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22   result.Append("
10020 2e 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  .");..          
10030 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
10040 73 79 6d 62 6f 6c 50 61 69 72 2e 43 6f 6c 75 6d  symbolPair.Colum
10050 6e 2e 43 6f 6c 75 6d 6e 73 5b 65 2e 50 72 6f 70  n.Columns[e.Prop
10060 65 72 74 79 2e 4e 61 6d 65 5d 29 3b 0d 0a 20 20  erty.Name]);..  
10070 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10080 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 20 20   result;..      
10090 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
100a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
100b0 20 2f 2f 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   // ------------
100c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 0d 0a 20  -----------.... 
100e0 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 6e 65       result = ne
100f0 77 20 53 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d  w SqlBuilder();.
10100 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70  .      result.Ap
10110 70 65 6e 64 28 69 6e 73 74 61 6e 63 65 53 71 6c  pend(instanceSql
10120 29 3b 0d 0a 20 20 20 20 20 20 72 65 73 75 6c 74  );..      result
10130 2e 41 70 70 65 6e 64 28 22 2e 22 29 3b 0d 0a 0d  .Append(".");...
10140 0a 20 20 20 20 20 20 2f 2f 20 41 74 20 74 68 69  .      // At thi
10150 73 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 6c 75  s point the colu
10160 6d 6e 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62  mn name cannot b
10170 65 20 72 65 6e 61 6d 65 64 2c 20 73 6f 20 77 65  e renamed, so we
10180 20 64 6f 0d 0a 20 20 20 20 20 20 2f 2f 20 6e 6f   do..      // no
10190 74 20 75 73 65 20 61 20 73 79 6d 62 6f 6c 2e 0d  t use a symbol..
101a0 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70  .      result.Ap
101b0 70 65 6e 64 28 51 75 6f 74 65 49 64 65 6e 74 69  pend(QuoteIdenti
101c0 66 69 65 72 28 65 2e 50 72 6f 70 65 72 74 79 2e  fier(e.Property.
101d0 4e 61 6d 65 29 29 3b 0d 0a 0d 0a 20 20 20 20 20  Name));....     
101e0 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d   return result;.
101f0 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
10200 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
10210 20 2f 2f 2f 20 41 6e 79 28 69 6e 70 75 74 2c 20   /// Any(input, 
10220 78 29 20 3d 3e 20 45 78 69 73 74 73 28 46 69 6c  x) => Exists(Fil
10230 74 65 72 28 69 6e 70 75 74 2c 78 29 29 0d 0a 20  ter(input,x)).. 
10240 20 20 20 2f 2f 2f 20 41 6c 6c 28 69 6e 70 75 74     /// All(input
10250 2c 20 78 29 20 3d 3e 20 4e 6f 74 20 45 78 69 73  , x) => Not Exis
10260 74 73 28 46 69 6c 74 65 72 28 69 6e 70 75 74 2c  ts(Filter(input,
10270 20 6e 6f 74 28 78 29 29 0d 0a 20 20 20 20 2f 2f   not(x))..    //
10280 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
10290 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
102a0 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  e="e"></param>..
102b0 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
102c0 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  ></returns>..   
102d0 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
102e0 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69   ISqlFragment Vi
102f0 73 69 74 28 44 62 51 75 61 6e 74 69 66 69 65 72  sit(DbQuantifier
10300 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20  Expression e).. 
10310 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 71 6c 42     {..      SqlB
10320 75 69 6c 64 65 72 20 72 65 73 75 6c 74 20 3d 20  uilder result = 
10330 6e 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28 29  new SqlBuilder()
10340 3b 0d 0a 0d 0a 20 20 20 20 20 20 62 6f 6f 6c 20  ;....      bool 
10350 6e 65 67 61 74 65 50 72 65 64 69 63 61 74 65 20  negatePredicate 
10360 3d 20 28 65 2e 45 78 70 72 65 73 73 69 6f 6e 4b  = (e.ExpressionK
10370 69 6e 64 20 3d 3d 20 44 62 45 78 70 72 65 73 73  ind == DbExpress
10380 69 6f 6e 4b 69 6e 64 2e 41 6c 6c 29 3b 0d 0a 20  ionKind.All);.. 
10390 20 20 20 20 20 69 66 20 28 65 2e 45 78 70 72 65       if (e.Expre
103a0 73 73 69 6f 6e 4b 69 6e 64 20 3d 3d 20 44 62 45  ssionKind == DbE
103b0 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 41 6e  xpressionKind.An
103c0 79 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  y)..      {..   
103d0 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
103e0 6e 64 28 22 45 58 49 53 54 53 20 28 22 29 3b 0d  nd("EXISTS (");.
103f0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
10400 65 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  else..      {.. 
10410 20 20 20 20 20 20 20 44 65 62 75 67 2e 41 73 73         Debug.Ass
10420 65 72 74 28 65 2e 45 78 70 72 65 73 73 69 6f 6e  ert(e.Expression
10430 4b 69 6e 64 20 3d 3d 20 44 62 45 78 70 72 65 73  Kind == DbExpres
10440 73 69 6f 6e 4b 69 6e 64 2e 41 6c 6c 29 3b 0d 0a  sionKind.All);..
10450 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41          result.A
10460 70 70 65 6e 64 28 22 4e 4f 54 20 45 58 49 53 54  ppend("NOT EXIST
10470 53 20 28 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  S (");..      }.
10480 0a 0d 0a 20 20 20 20 20 20 53 71 6c 53 65 6c 65  ...      SqlSele
10490 63 74 53 74 61 74 65 6d 65 6e 74 20 66 69 6c 74  ctStatement filt
104a0 65 72 20 3d 20 56 69 73 69 74 46 69 6c 74 65 72  er = VisitFilter
104b0 45 78 70 72 65 73 73 69 6f 6e 28 65 2e 49 6e 70  Expression(e.Inp
104c0 75 74 2c 20 65 2e 50 72 65 64 69 63 61 74 65 2c  ut, e.Predicate,
104d0 20 6e 65 67 61 74 65 50 72 65 64 69 63 61 74 65   negatePredicate
104e0 29 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 66 69  );..      if (fi
104f0 6c 74 65 72 2e 53 65 6c 65 63 74 2e 49 73 45 6d  lter.Select.IsEm
10500 70 74 79 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  pty)..      {.. 
10510 20 20 20 20 20 20 20 41 64 64 44 65 66 61 75 6c         AddDefaul
10520 74 43 6f 6c 75 6d 6e 73 28 66 69 6c 74 65 72 29  tColumns(filter)
10530 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
10540 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e      result.Appen
10550 64 28 66 69 6c 74 65 72 29 3b 0d 0a 20 20 20 20  d(filter);..    
10560 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
10570 22 29 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 72  ")");....      r
10580 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20  eturn result;.. 
10590 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
105a0 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
105b0 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 44 62  // <see cref="Db
105c0 52 65 66 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e  RefExpression"/>
105d0 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 74 20 74   is illegal at t
105e0 68 69 73 20 73 74 61 67 65 0d 0a 20 20 20 20 2f  his stage..    /
105f0 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
10600 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
10610 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  me="e"></param>.
10620 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
10630 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  s></returns>..  
10640 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
10650 65 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56  e ISqlFragment V
10660 69 73 69 74 28 44 62 52 65 66 45 78 70 72 65 73  isit(DbRefExpres
10670 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a  sion e)..    {..
10680 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
10690 4e 6f 74 53 75 70 70 6f 72 74 65 64 45 78 63 65  NotSupportedExce
106a0 70 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 7d 0d  ption();..    }.
106b0 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
106c0 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  ary>..    /// <s
106d0 65 65 20 63 72 65 66 3d 22 44 62 52 65 6c 61 74  ee cref="DbRelat
106e0 69 6f 6e 73 68 69 70 4e 61 76 69 67 61 74 69 6f  ionshipNavigatio
106f0 6e 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e 20 69  nExpression"/> i
10700 73 20 69 6c 6c 65 67 61 6c 20 61 74 20 74 68 69  s illegal at thi
10710 73 20 73 74 61 67 65 0d 0a 20 20 20 20 2f 2f 2f  s stage..    ///
10720 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
10730 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
10740 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ="e"></param>.. 
10750 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
10760 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
10770 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
10780 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73  ISqlFragment Vis
10790 69 74 28 44 62 52 65 6c 61 74 69 6f 6e 73 68 69  it(DbRelationshi
107a0 70 4e 61 76 69 67 61 74 69 6f 6e 45 78 70 72 65  pNavigationExpre
107b0 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d  ssion e)..    {.
107c0 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77  .      throw new
107d0 20 4e 6f 74 53 75 70 70 6f 72 74 65 64 45 78 63   NotSupportedExc
107e0 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 7d  eption();..    }
107f0 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
10800 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 46  mary>..    /// F
10810 6f 72 20 53 71 6c 39 20 69 74 20 74 72 61 6e 73  or Sql9 it trans
10820 6c 61 74 65 73 20 74 6f 3a 0d 0a 20 20 20 20 2f  lates to:..    /
10830 2f 2f 20 53 45 4c 45 43 54 20 59 2e 78 31 2c 20  // SELECT Y.x1, 
10840 59 2e 78 32 2c 20 2e 2e 2e 2c 20 59 2e 78 6e 0d  Y.x2, ..., Y.xn.
10850 0a 20 20 20 20 2f 2f 2f 20 46 52 4f 4d 20 28 0d  .    /// FROM (.
10860 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 53 45 4c  .    ///     SEL
10870 45 43 54 20 58 2e 78 31 2c 20 58 2e 78 32 2c 20  ECT X.x1, X.x2, 
10880 2e 2e 2e 2c 20 58 2e 78 6e 2c 20 72 6f 77 5f 6e  ..., X.xn, row_n
10890 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28 4f 52  umber() OVER (OR
108a0 44 45 52 20 42 59 20 73 6b 31 2c 20 73 6b 32 2c  DER BY sk1, sk2,
108b0 20 2e 2e 2e 29 20 41 53 20 5b 72 6f 77 5f 6e 75   ...) AS [row_nu
108c0 6d 62 65 72 5d 0d 0a 20 20 20 20 2f 2f 2f 20 20  mber]..    ///  
108d0 20 20 20 46 52 4f 4d 20 69 6e 70 75 74 20 61 73     FROM input as
108e0 20 58 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20   X..    ///     
108f0 29 20 61 73 20 59 0d 0a 20 20 20 20 2f 2f 2f 20  ) as Y..    /// 
10900 57 48 45 52 45 20 59 2e 5b 72 6f 77 5f 6e 75 6d  WHERE Y.[row_num
10910 62 65 72 5d 20 3e 20 63 6f 75 6e 74 0d 0a 20 20  ber] > count..  
10920 20 20 2f 2f 2f 20 4f 52 44 45 52 20 42 59 20 73    /// ORDER BY s
10930 6b 31 2c 20 73 6b 32 2c 20 2e 2e 2e 0d 0a 20 20  k1, sk2, .....  
10940 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
10950 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
10960 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61   name="e"></para
10970 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
10980 75 72 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66  urns>A <see cref
10990 3d 22 53 71 6c 42 75 69 6c 64 65 72 22 2f 3e 3c  ="SqlBuilder"/><
109a0 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70  /returns>..    p
109b0 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49  ublic override I
109c0 53 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69  SqlFragment Visi
109d0 74 28 44 62 53 6b 69 70 45 78 70 72 65 73 73 69  t(DbSkipExpressi
109e0 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  on e)..    {..  
109f0 20 20 20 20 20 20 44 65 62 75 67 2e 41 73 73 65        Debug.Asse
10a00 72 74 28 65 2e 43 6f 75 6e 74 20 69 73 20 44 62  rt(e.Count is Db
10a10 43 6f 6e 73 74 61 6e 74 45 78 70 72 65 73 73 69  ConstantExpressi
10a20 6f 6e 20 7c 7c 20 65 2e 43 6f 75 6e 74 20 69 73  on || e.Count is
10a30 20 44 62 50 61 72 61 6d 65 74 65 72 52 65 66 65   DbParameterRefe
10a40 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f 6e 2c  renceExpression,
10a50 20 22 44 62 4c 69 6d 69 74 45 78 70 72 65 73 73   "DbLimitExpress
10a60 69 6f 6e 2e 43 6f 75 6e 74 20 69 73 20 6f 66 20  ion.Count is of 
10a70 69 6e 76 61 6c 69 64 20 65 78 70 72 65 73 73 69  invalid expressi
10a80 6f 6e 20 74 79 70 65 22 29 3b 0d 0a 0d 0a 20 20  on type");....  
10a90 20 20 20 20 20 20 53 79 6d 62 6f 6c 20 66 72 6f        Symbol fro
10aa0 6d 53 79 6d 62 6f 6c 3b 0d 0a 20 20 20 20 20 20  mSymbol;..      
10ab0 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65    SqlSelectState
10ac0 6d 65 6e 74 20 72 65 73 75 6c 74 20 3d 20 56 69  ment result = Vi
10ad0 73 69 74 49 6e 70 75 74 45 78 70 72 65 73 73 69  sitInputExpressi
10ae0 6f 6e 28 65 2e 49 6e 70 75 74 2e 45 78 70 72 65  on(e.Input.Expre
10af0 73 73 69 6f 6e 2c 20 65 2e 49 6e 70 75 74 2e 56  ssion, e.Input.V
10b00 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20 65 2e 49  ariableName, e.I
10b10 6e 70 75 74 2e 56 61 72 69 61 62 6c 65 54 79 70  nput.VariableTyp
10b20 65 2c 20 6f 75 74 20 66 72 6f 6d 53 79 6d 62 6f  e, out fromSymbo
10b30 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  l);....        i
10b40 66 20 28 21 49 73 43 6f 6d 70 61 74 69 62 6c 65  f (!IsCompatible
10b50 28 72 65 73 75 6c 74 2c 20 65 2e 45 78 70 72 65  (result, e.Expre
10b60 73 73 69 6f 6e 4b 69 6e 64 29 29 0d 0a 20 20 20  ssionKind))..   
10b70 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
10b80 20 20 20 20 72 65 73 75 6c 74 20 3d 20 43 72 65      result = Cre
10b90 61 74 65 4e 65 77 53 65 6c 65 63 74 53 74 61 74  ateNewSelectStat
10ba0 65 6d 65 6e 74 28 72 65 73 75 6c 74 2c 20 65 2e  ement(result, e.
10bb0 49 6e 70 75 74 2e 56 61 72 69 61 62 6c 65 4e 61  Input.VariableNa
10bc0 6d 65 2c 20 65 2e 49 6e 70 75 74 2e 56 61 72 69  me, e.Input.Vari
10bd0 61 62 6c 65 54 79 70 65 2c 20 6f 75 74 20 66 72  ableType, out fr
10be0 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20  omSymbol);..    
10bf0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10c00 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74   selectStatement
10c10 53 74 61 63 6b 2e 50 75 73 68 28 72 65 73 75 6c  Stack.Push(resul
10c20 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 79 6d  t);..        sym
10c30 62 6f 6c 54 61 62 6c 65 2e 45 6e 74 65 72 53 63  bolTable.EnterSc
10c40 6f 70 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ope();....      
10c50 20 20 41 64 64 46 72 6f 6d 53 79 6d 62 6f 6c 28    AddFromSymbol(
10c60 72 65 73 75 6c 74 2c 20 65 2e 49 6e 70 75 74 2e  result, e.Input.
10c70 56 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20 66 72  VariableName, fr
10c80 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 0d 0a 20 20  omSymbol);....  
10c90 20 20 20 20 20 20 41 64 64 53 6f 72 74 4b 65 79        AddSortKey
10ca0 73 28 72 65 73 75 6c 74 2e 4f 72 64 65 72 42 79  s(result.OrderBy
10cb0 2c 20 65 2e 53 6f 72 74 4f 72 64 65 72 29 3b 0d  , e.SortOrder);.
10cc0 0a 0d 0a 20 20 20 20 20 20 20 20 73 79 6d 62 6f  ...        symbo
10cd0 6c 54 61 62 6c 65 2e 45 78 69 74 53 63 6f 70 65  lTable.ExitScope
10ce0 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 65 6c  ();..        sel
10cf0 65 63 74 53 74 61 74 65 6d 65 6e 74 53 74 61 63  ectStatementStac
10d00 6b 2e 50 6f 70 28 29 3b 0d 0a 0d 0a 20 20 20 20  k.Pop();....    
10d10 20 20 20 20 49 53 71 6c 46 72 61 67 6d 65 6e 74      ISqlFragment
10d20 20 73 6b 69 70 43 6f 75 6e 74 20 3d 20 48 61 6e   skipCount = Han
10d30 64 6c 65 43 6f 75 6e 74 45 78 70 72 65 73 73 69  dleCountExpressi
10d40 6f 6e 28 65 2e 43 6f 75 6e 74 29 3b 0d 0a 0d 0a  on(e.Count);....
10d50 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 53          result.S
10d60 6b 69 70 20 3d 20 6e 65 77 20 53 6b 69 70 43 6c  kip = new SkipCl
10d70 61 75 73 65 28 73 6b 69 70 43 6f 75 6e 74 29 3b  ause(skipCount);
10d80 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
10d90 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d   result;..    }.
10da0 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
10db0 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  ary>..    /// <s
10dc0 65 65 20 63 72 65 66 3d 22 56 69 73 69 74 28 44  ee cref="Visit(D
10dd0 62 46 69 6c 74 65 72 45 78 70 72 65 73 73 69 6f  bFilterExpressio
10de0 6e 29 22 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  n)"/>..    /// <
10df0 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
10e00 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
10e10 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  e"></param>..   
10e20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 41 20   /// <returns>A 
10e30 3c 73 65 65 20 63 72 65 66 3d 22 53 71 6c 53 65  <see cref="SqlSe
10e40 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 22 2f 3e  lectStatement"/>
10e50 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
10e60 2f 2f 2f 20 3c 73 65 65 61 6c 73 6f 20 63 72 65  /// <seealso cre
10e70 66 3d 22 56 69 73 69 74 28 44 62 46 69 6c 74 65  f="Visit(DbFilte
10e80 72 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e 0d  rExpression)"/>.
10e90 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
10ea0 72 69 64 65 20 49 53 71 6c 46 72 61 67 6d 65 6e  ride ISqlFragmen
10eb0 74 20 56 69 73 69 74 28 44 62 53 6f 72 74 45 78  t Visit(DbSortEx
10ec0 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20  pression e)..   
10ed0 20 7b 0d 0a 20 20 20 20 20 20 53 79 6d 62 6f 6c   {..      Symbol
10ee0 20 66 72 6f 6d 53 79 6d 62 6f 6c 3b 0d 0a 20 20   fromSymbol;..  
10ef0 20 20 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61      SqlSelectSta
10f00 74 65 6d 65 6e 74 20 72 65 73 75 6c 74 20 3d 20  tement result = 
10f10 56 69 73 69 74 49 6e 70 75 74 45 78 70 72 65 73  VisitInputExpres
10f20 73 69 6f 6e 28 65 2e 49 6e 70 75 74 2e 45 78 70  sion(e.Input.Exp
10f30 72 65 73 73 69 6f 6e 2c 20 65 2e 49 6e 70 75 74  ression, e.Input
10f40 2e 56 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20 65  .VariableName, e
10f50 2e 49 6e 70 75 74 2e 56 61 72 69 61 62 6c 65 54  .Input.VariableT
10f60 79 70 65 2c 20 6f 75 74 20 66 72 6f 6d 53 79 6d  ype, out fromSym
10f70 62 6f 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f  bol);....      /
10f80 2f 20 4f 72 64 65 72 42 79 20 69 73 20 63 6f 6d  / OrderBy is com
10f90 70 61 74 69 62 6c 65 20 77 69 74 68 20 46 69 6c  patible with Fil
10fa0 74 65 72 0d 0a 20 20 20 20 20 20 2f 2f 20 61 6e  ter..      // an
10fb0 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 0d 0a  d nothing else..
10fc0 20 20 20 20 20 20 69 66 20 28 21 49 73 43 6f 6d        if (!IsCom
10fd0 70 61 74 69 62 6c 65 28 72 65 73 75 6c 74 2c 20  patible(result, 
10fe0 65 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64  e.ExpressionKind
10ff0 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ))..      {..   
11000 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 43 72       result = Cr
11010 65 61 74 65 4e 65 77 53 65 6c 65 63 74 53 74 61  eateNewSelectSta
11020 74 65 6d 65 6e 74 28 72 65 73 75 6c 74 2c 20 65  tement(result, e
11030 2e 49 6e 70 75 74 2e 56 61 72 69 61 62 6c 65 4e  .Input.VariableN
11040 61 6d 65 2c 20 65 2e 49 6e 70 75 74 2e 56 61 72  ame, e.Input.Var
11050 69 61 62 6c 65 54 79 70 65 2c 20 6f 75 74 20 66  iableType, out f
11060 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20  romSymbol);..   
11070 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
11080 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 53 74 61  lectStatementSta
11090 63 6b 2e 50 75 73 68 28 72 65 73 75 6c 74 29 3b  ck.Push(result);
110a0 0d 0a 20 20 20 20 20 20 73 79 6d 62 6f 6c 54 61  ..      symbolTa
110b0 62 6c 65 2e 45 6e 74 65 72 53 63 6f 70 65 28 29  ble.EnterScope()
110c0 3b 0d 0a 0d 0a 20 20 20 20 20 20 41 64 64 46 72  ;....      AddFr
110d0 6f 6d 53 79 6d 62 6f 6c 28 72 65 73 75 6c 74 2c  omSymbol(result,
110e0 20 65 2e 49 6e 70 75 74 2e 56 61 72 69 61 62 6c   e.Input.Variabl
110f0 65 4e 61 6d 65 2c 20 66 72 6f 6d 53 79 6d 62 6f  eName, fromSymbo
11100 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 41 64 64  l);....      Add
11110 53 6f 72 74 4b 65 79 73 28 72 65 73 75 6c 74 2e  SortKeys(result.
11120 4f 72 64 65 72 42 79 2c 20 65 2e 53 6f 72 74 4f  OrderBy, e.SortO
11130 72 64 65 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  rder);....      
11140 73 79 6d 62 6f 6c 54 61 62 6c 65 2e 45 78 69 74  symbolTable.Exit
11150 53 63 6f 70 65 28 29 3b 0d 0a 20 20 20 20 20 20  Scope();..      
11160 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 53  selectStatementS
11170 74 61 63 6b 2e 50 6f 70 28 29 3b 0d 0a 0d 0a 20  tack.Pop();.... 
11180 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75       return resu
11190 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  lt;..    }....  
111a0 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
111b0 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72  .    /// <see cr
111c0 65 66 3d 22 44 62 54 72 65 61 74 45 78 70 72 65  ef="DbTreatExpre
111d0 73 73 69 6f 6e 22 2f 3e 20 69 73 20 69 6c 6c 65  ssion"/> is ille
111e0 67 61 6c 20 61 74 20 74 68 69 73 20 73 74 61 67  gal at this stag
111f0 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  e..    /// </sum
11200 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
11210 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c  param name="e"><
11220 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
11230 20 3c 72 65 74 75 72 6e 73 3e 41 20 3c 73 65 65   <returns>A <see
11240 20 63 72 65 66 3d 22 53 71 6c 42 75 69 6c 64 65   cref="SqlBuilde
11250 72 22 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  r"/></returns>..
11260 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
11270 69 64 65 20 49 53 71 6c 46 72 61 67 6d 65 6e 74  ide ISqlFragment
11280 20 56 69 73 69 74 28 44 62 54 72 65 61 74 45 78   Visit(DbTreatEx
11290 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20  pression e)..   
112a0 20 7b 0d 0a 20 20 20 20 20 20 74 68 72 6f 77 20   {..      throw 
112b0 6e 65 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64  new NotSupported
112c0 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20  Exception();..  
112d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
112e0 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
112f0 2f 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 73  / This code is s
11300 68 61 72 65 64 20 62 79 20 3c 73 65 65 20 63 72  hared by <see cr
11310 65 66 3d 22 56 69 73 69 74 28 44 62 45 78 63 65  ef="Visit(DbExce
11320 70 74 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e  ptExpression)"/>
11330 0d 0a 20 20 20 20 2f 2f 2f 20 61 6e 64 20 3c 73  ..    /// and <s
11340 65 65 20 63 72 65 66 3d 22 56 69 73 69 74 28 44  ee cref="Visit(D
11350 62 49 6e 74 65 72 73 65 63 74 45 78 70 72 65 73  bIntersectExpres
11360 73 69 6f 6e 29 22 2f 3e 0d 0a 20 20 20 20 2f 2f  sion)"/>..    //
11370 2f 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20  /..    /// <see 
11380 63 72 65 66 3d 22 56 69 73 69 74 53 65 74 4f 70  cref="VisitSetOp
11390 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e 0d 0a 20  Expression"/>.. 
113a0 20 20 20 2f 2f 2f 20 53 69 6e 63 65 20 74 68 65     /// Since the
113b0 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
113c0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 6e  expression may n
113d0 6f 74 20 62 65 20 53 71 6c 20 73 65 6c 65 63 74  ot be Sql select
113e0 20 73 74 61 74 65 6d 65 6e 74 73 2c 0d 0a 20 20   statements,..  
113f0 20 20 2f 2f 2f 20 77 65 20 6d 75 73 74 20 77 72    /// we must wr
11400 61 70 20 74 68 65 6d 20 75 70 20 74 6f 20 6c 6f  ap them up to lo
11410 6f 6b 20 6c 69 6b 65 20 53 51 4c 20 73 65 6c 65  ok like SQL sele
11420 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a  ct statements...
11430 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
11440 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  y>..    /// <par
11450 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61  am name="e"></pa
11460 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
11470 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73  eturns></returns
11480 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  >..    public ov
11490 65 72 72 69 64 65 20 49 53 71 6c 46 72 61 67 6d  erride ISqlFragm
114a0 65 6e 74 20 56 69 73 69 74 28 44 62 55 6e 69 6f  ent Visit(DbUnio
114b0 6e 41 6c 6c 45 78 70 72 65 73 73 69 6f 6e 20 65  nAllExpression e
114c0 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
114d0 72 65 74 75 72 6e 20 56 69 73 69 74 53 65 74 4f  return VisitSetO
114e0 70 45 78 70 72 65 73 73 69 6f 6e 28 65 2e 4c 65  pExpression(e.Le
114f0 66 74 2c 20 65 2e 52 69 67 68 74 2c 20 22 55 4e  ft, e.Right, "UN
11500 49 4f 4e 20 41 4c 4c 22 29 3b 0d 0a 20 20 20 20  ION ALL");..    
11510 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
11520 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
11530 54 68 69 73 20 6d 65 74 68 6f 64 20 64 65 74 65  This method dete
11540 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 61  rmines whether a
11550 6e 20 65 78 74 65 6e 74 20 66 72 6f 6d 20 61 6e  n extent from an
11560 20 6f 75 74 65 72 20 73 63 6f 70 65 28 66 72 65   outer scope(fre
11570 65 20 76 61 72 69 61 62 6c 65 29 0d 0a 20 20 20  e variable)..   
11580 20 2f 2f 2f 20 69 73 20 75 73 65 64 20 69 6e 20   /// is used in 
11590 74 68 65 20 43 75 72 72 65 6e 74 53 65 6c 65 63  the CurrentSelec
115a0 74 53 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20  tStatement...   
115b0 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 41 6e   ///..    /// An
115c0 20 65 78 74 65 6e 74 20 69 6e 20 61 6e 20 6f 75   extent in an ou
115d0 74 65 72 20 73 63 6f 70 65 2c 20 69 66 20 69 74  ter scope, if it
115e0 73 20 73 79 6d 62 6f 6c 20 69 73 20 6e 6f 74 20  s symbol is not 
115f0 69 6e 20 74 68 65 20 46 72 6f 6d 45 78 74 65 6e  in the FromExten
11600 74 73 0d 0a 20 20 20 20 2f 2f 2f 20 6f 66 20 74  ts..    /// of t
11610 68 65 20 43 75 72 72 65 6e 74 53 65 6c 65 63 74  he CurrentSelect
11620 53 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20  Statement...    
11630 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
11640 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
11650 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e  ame="e"></param>
11660 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72  ..    /// <retur
11670 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d 22  ns>A <see cref="
11680 53 79 6d 62 6f 6c 22 2f 3e 2e 3c 2f 72 65 74 75  Symbol"/>.</retu
11690 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63  rns>..    public
116a0 20 6f 76 65 72 72 69 64 65 20 49 53 71 6c 46 72   override ISqlFr
116b0 61 67 6d 65 6e 74 20 56 69 73 69 74 28 44 62 56  agment Visit(DbV
116c0 61 72 69 61 62 6c 65 52 65 66 65 72 65 6e 63 65  ariableReference
116d0 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20  Expression e).. 
116e0 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 28     {..      if (
116f0 69 73 56 61 72 52 65 66 53 69 6e 67 6c 65 29 0d  isVarRefSingle).
11700 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
11710 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74 53    throw new NotS
11720 75 70 70 6f 72 74 65 64 45 78 63 65 70 74 69 6f  upportedExceptio
11730 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  n();..        //
11740 20 41 20 44 62 56 61 72 69 61 62 6c 65 52 65 66   A DbVariableRef
11750 65 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f 6e  erenceExpression
11760 20 68 61 73 20 74 6f 20 62 65 20 61 20 63 68 69   has to be a chi
11770 6c 64 20 6f 66 20 44 62 50 72 6f 70 65 72 74 79  ld of DbProperty
11780 45 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 4d 65  Expression or Me
11790 74 68 6f 64 45 78 70 72 65 73 73 69 6f 6e 0d 0a  thodExpression..
117a0 20 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20          // This 
117b0 69 73 20 61 6c 73 6f 20 63 68 65 63 6b 65 64 20  is also checked 
117c0 69 6e 20 47 65 6e 65 72 61 74 65 53 71 6c 28 2e  in GenerateSql(.
117d0 2e 2e 29 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ..) at the end o
117e0 66 20 74 68 65 20 76 69 73 69 74 69 6e 67 2e 0d  f the visiting..
117f0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
11800 69 73 56 61 72 52 65 66 53 69 6e 67 6c 65 20 3d  isVarRefSingle =
11810 20 74 72 75 65 3b 20 2f 2f 20 54 68 69 73 20 77   true; // This w
11820 69 6c 6c 20 62 65 20 72 65 73 65 74 20 62 79 20  ill be reset by 
11830 44 62 50 72 6f 70 65 72 74 79 45 78 70 72 65 73  DbPropertyExpres
11840 73 69 6f 6e 20 6f 72 20 4d 65 74 68 6f 64 45 78  sion or MethodEx
11850 70 72 65 73 73 69 6f 6e 0d 0a 0d 0a 20 20 20 20  pression....    
11860 20 20 53 79 6d 62 6f 6c 20 72 65 73 75 6c 74 20    Symbol result 
11870 3d 20 73 79 6d 62 6f 6c 54 61 62 6c 65 2e 4c 6f  = symbolTable.Lo
11880 6f 6b 75 70 28 65 2e 56 61 72 69 61 62 6c 65 4e  okup(e.VariableN
11890 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 20  ame);..      if 
118a0 28 21 43 75 72 72 65 6e 74 53 65 6c 65 63 74 53  (!CurrentSelectS
118b0 74 61 74 65 6d 65 6e 74 2e 46 72 6f 6d 45 78 74  tatement.FromExt
118c0 65 6e 74 73 2e 43 6f 6e 74 61 69 6e 73 28 72 65  ents.Contains(re
118d0 73 75 6c 74 29 29 0d 0a 20 20 20 20 20 20 7b 0d  sult))..      {.
118e0 0a 20 20 20 20 20 20 20 20 43 75 72 72 65 6e 74  .        Current
118f0 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 2e  SelectStatement.
11900 4f 75 74 65 72 45 78 74 65 6e 74 73 5b 72 65 73  OuterExtents[res
11910 75 6c 74 5d 20 3d 20 74 72 75 65 3b 0d 0a 20 20  ult] = true;..  
11920 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
11930 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20  eturn result;.. 
11940 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 72 65 67     }....    #reg
11950 69 6f 6e 20 56 69 73 69 74 73 20 73 68 61 72 65  ion Visits share
11960 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 6e 6f  d by multiple no
11970 64 65 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  des..    /// <su
11980 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
11990 41 67 67 72 65 67 61 74 65 73 20 61 72 65 20 6e  Aggregates are n
119a0 6f 74 20 76 69 73 69 74 65 64 20 62 79 20 74 68  ot visited by th
119b0 65 20 6e 6f 72 6d 61 6c 20 76 69 73 69 74 6f 72  e normal visitor
119c0 20 77 61 6c 6b 2e 0d 0a 20 20 20 20 2f 2f 2f 20   walk...    /// 
119d0 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
119e0 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
119f0 22 61 67 67 72 65 67 61 74 65 22 3e 54 68 65 20  "aggregate">The 
11a00 61 67 67 72 65 61 74 65 20 74 6f 20 62 65 20 74  aggreate to be t
11a10 72 61 6e 73 6c 61 74 65 64 3c 2f 70 61 72 61 6d  ranslated</param
11a20 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
11a30 6d 20 6e 61 6d 65 3d 22 61 67 67 72 65 67 61 74  m name="aggregat
11a40 65 41 72 67 75 6d 65 6e 74 22 3e 54 68 65 20 74  eArgument">The t
11a50 72 61 6e 73 6c 61 74 65 64 20 61 67 67 72 65 67  ranslated aggreg
11a60 61 74 65 20 61 72 67 75 6d 65 6e 74 3c 2f 70 61  ate argument</pa
11a70 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
11a80 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73  eturns></returns
11a90 3e 0d 0a 20 20 20 20 53 71 6c 42 75 69 6c 64 65  >..    SqlBuilde
11aa0 72 20 56 69 73 69 74 41 67 67 72 65 67 61 74 65  r VisitAggregate
11ab0 28 44 62 41 67 67 72 65 67 61 74 65 20 61 67 67  (DbAggregate agg
11ac0 72 65 67 61 74 65 2c 20 6f 62 6a 65 63 74 20 61  regate, object a
11ad0 67 67 72 65 67 61 74 65 41 72 67 75 6d 65 6e 74  ggregateArgument
11ae0 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
11af0 53 71 6c 42 75 69 6c 64 65 72 20 61 67 67 72 65  SqlBuilder aggre
11b00 67 61 74 65 52 65 73 75 6c 74 20 3d 20 6e 65 77  gateResult = new
11b10 20 53 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d 0a   SqlBuilder();..
11b20 20 20 20 20 20 20 44 62 46 75 6e 63 74 69 6f 6e        DbFunction
11b30 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  Aggregate functi
11b40 6f 6e 41 67 67 72 65 67 61 74 65 20 3d 20 61 67  onAggregate = ag
11b50 67 72 65 67 61 74 65 20 61 73 20 44 62 46 75 6e  gregate as DbFun
11b60 63 74 69 6f 6e 41 67 67 72 65 67 61 74 65 3b 0d  ctionAggregate;.
11b70 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 66 75 6e  ...      if (fun
11b80 63 74 69 6f 6e 41 67 67 72 65 67 61 74 65 20 3d  ctionAggregate =
11b90 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 7b  = null)..      {
11ba0 0d 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20  ..        throw 
11bb0 6e 65 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64  new NotSupported
11bc0 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20  Exception();..  
11bd0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f      }....      /
11be0 2f 54 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67  /The only aggreg
11bf0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ate function wit
11c00 68 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65  h different name
11c10 20 69 73 20 42 69 67 5f 43 6f 75 6e 74 0d 0a 20   is Big_Count.. 
11c20 20 20 20 20 20 2f 2f 4e 6f 74 65 3a 20 49 66 20       //Note: If 
11c30 61 6e 6f 74 68 65 72 20 73 75 63 68 20 66 75 6e  another such fun
11c40 63 74 69 6f 6e 20 69 73 20 74 6f 20 62 65 20 61  ction is to be a
11c50 64 64 65 64 2c 20 61 20 64 69 63 74 69 6f 6e 61  dded, a dictiona
11c60 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 72 65  ry should be cre
11c70 61 74 65 64 0d 0a 20 20 20 20 20 20 2f 2f 69 66  ated..      //if
11c80 20 28 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72   (MetadataHelper
11c90 73 2e 49 73 43 61 6e 6f 6e 69 63 61 6c 46 75 6e  s.IsCanonicalFun
11ca0 63 74 69 6f 6e 28 66 75 6e 63 74 69 6f 6e 41 67  ction(functionAg
11cb0 67 72 65 67 61 74 65 2e 46 75 6e 63 74 69 6f 6e  gregate.Function
11cc0 29 0d 0a 20 20 20 20 20 20 2f 2f 20 20 20 20 26  )..      //    &
11cd0 26 20 53 74 72 69 6e 67 2e 45 71 75 61 6c 73 28  & String.Equals(
11ce0 66 75 6e 63 74 69 6f 6e 41 67 67 72 65 67 61 74  functionAggregat
11cf0 65 2e 46 75 6e 63 74 69 6f 6e 2e 4e 61 6d 65 2c  e.Function.Name,
11d00 20 22 42 69 67 43 6f 75 6e 74 22 2c 20 53 74 72   "BigCount", Str
11d10 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72  ingComparison.Or
11d20 64 69 6e 61 6c 29 29 0d 0a 20 20 20 20 20 20 2f  dinal))..      /
11d30 2f 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 20 61 67  /{..      //  ag
11d40 67 72 65 67 61 74 65 52 65 73 75 6c 74 2e 41 70  gregateResult.Ap
11d50 70 65 6e 64 28 22 43 4f 55 4e 54 5f 42 49 47 22  pend("COUNT_BIG"
11d60 29 3b 0d 0a 20 20 20 20 20 20 2f 2f 7d 0d 0a 20  );..      //}.. 
11d70 20 20 20 20 20 2f 2f 65 6c 73 65 0d 0a 20 20 20       //else..   
11d80 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 57 72     {..        Wr
11d90 69 74 65 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28  iteFunctionName(
11da0 61 67 67 72 65 67 61 74 65 52 65 73 75 6c 74 2c  aggregateResult,
11db0 20 66 75 6e 63 74 69 6f 6e 41 67 67 72 65 67 61   functionAggrega
11dc0 74 65 2e 46 75 6e 63 74 69 6f 6e 29 3b 0d 0a 20  te.Function);.. 
11dd0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11de0 61 67 67 72 65 67 61 74 65 52 65 73 75 6c 74 2e  aggregateResult.
11df0 41 70 70 65 6e 64 28 22 28 22 29 3b 0d 0a 0d 0a  Append("(");....
11e00 20 20 20 20 20 20 44 62 46 75 6e 63 74 69 6f 6e        DbFunction
11e10 41 67 67 72 65 67 61 74 65 20 66 6e 41 67 67 72  Aggregate fnAggr
11e20 20 3d 20 66 75 6e 63 74 69 6f 6e 41 67 67 72 65   = functionAggre
11e30 67 61 74 65 3b 0d 0a 20 20 20 20 20 20 69 66 20  gate;..      if 
11e40 28 28 6e 75 6c 6c 20 21 3d 20 66 6e 41 67 67 72  ((null != fnAggr
11e50 29 20 26 26 20 28 66 6e 41 67 67 72 2e 44 69 73  ) && (fnAggr.Dis
11e60 74 69 6e 63 74 29 29 0d 0a 20 20 20 20 20 20 7b  tinct))..      {
11e70 0d 0a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  ..        aggreg
11e80 61 74 65 52 65 73 75 6c 74 2e 41 70 70 65 6e 64  ateResult.Append
11e90 28 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0d 0a  ("DISTINCT ");..
11ea0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11eb0 20 61 67 67 72 65 67 61 74 65 52 65 73 75 6c 74   aggregateResult
11ec0 2e 41 70 70 65 6e 64 28 61 67 67 72 65 67 61 74  .Append(aggregat
11ed0 65 41 72 67 75 6d 65 6e 74 29 3b 0d 0a 0d 0a 20  eArgument);.... 
11ee0 20 20 20 20 20 61 67 67 72 65 67 61 74 65 52 65       aggregateRe
11ef0 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 29 22 29  sult.Append(")")
11f00 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
11f10 61 67 67 72 65 67 61 74 65 52 65 73 75 6c 74 3b  aggregateResult;
11f20 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 0d 0a 20 20 20  ..    }......   
11f30 20 53 71 6c 42 75 69 6c 64 65 72 20 56 69 73 69   SqlBuilder Visi
11f40 74 42 69 6e 61 72 79 45 78 70 72 65 73 73 69 6f  tBinaryExpressio
11f50 6e 28 73 74 72 69 6e 67 20 6f 70 2c 20 44 62 45  n(string op, DbE
11f60 78 70 72 65 73 73 69 6f 6e 20 6c 65 66 74 2c 20  xpression left, 
11f70 44 62 45 78 70 72 65 73 73 69 6f 6e 20 72 69 67  DbExpression rig
11f80 68 74 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  ht)..    {..    
11f90 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73    SqlBuilder res
11fa0 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69  ult = new SqlBui
11fb0 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 69  lder();..      i
11fc0 66 20 28 49 73 43 6f 6d 70 6c 65 78 45 78 70 72  f (IsComplexExpr
11fd0 65 73 73 69 6f 6e 28 6c 65 66 74 29 29 0d 0a 20  ession(left)).. 
11fe0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
11ff0 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 28  result.Append("(
12000 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ");..      }....
12010 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
12020 65 6e 64 28 6c 65 66 74 2e 41 63 63 65 70 74 28  end(left.Accept(
12030 74 68 69 73 29 29 3b 0d 0a 0d 0a 20 20 20 20 20  this));....     
12040 20 69 66 20 28 49 73 43 6f 6d 70 6c 65 78 45 78   if (IsComplexEx
12050 70 72 65 73 73 69 6f 6e 28 6c 65 66 74 29 29 0d  pression(left)).
12060 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
12070 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
12080 22 29 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  ")");..      }..
12090 0d 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41  ..      result.A
120a0 70 70 65 6e 64 28 6f 70 29 3b 0d 0a 0d 0a 20 20  ppend(op);....  
120b0 20 20 20 20 69 66 20 28 49 73 43 6f 6d 70 6c 65      if (IsComple
120c0 78 45 78 70 72 65 73 73 69 6f 6e 28 72 69 67 68  xExpression(righ
120d0 74 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  t))..      {..  
120e0 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
120f0 65 6e 64 28 22 28 22 29 3b 0d 0a 20 20 20 20 20  end("(");..     
12100 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 75   }....      resu
12110 6c 74 2e 41 70 70 65 6e 64 28 72 69 67 68 74 2e  lt.Append(right.
12120 41 63 63 65 70 74 28 74 68 69 73 29 29 3b 0d 0a  Accept(this));..
12130 0d 0a 20 20 20 20 20 20 69 66 20 28 49 73 43 6f  ..      if (IsCo
12140 6d 70 6c 65 78 45 78 70 72 65 73 73 69 6f 6e 28  mplexExpression(
12150 72 69 67 68 74 29 29 0d 0a 20 20 20 20 20 20 7b  right))..      {
12160 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  ..        result
12170 2e 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a 20  .Append(")");.. 
12180 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12190 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a  return result;..
121a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
121b0 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
121c0 2f 2f 2f 20 54 68 69 73 20 69 73 20 63 61 6c 6c  /// This is call
121d0 65 64 20 62 79 20 74 68 65 20 72 65 6c 61 74 69  ed by the relati
121e0 6f 6e 61 6c 20 6e 6f 64 65 73 2e 20 20 49 74 20  onal nodes.  It 
121f0 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
12200 6e 67 0d 0a 20 20 20 20 2f 2f 2f 20 3c 6c 69 73  ng..    /// <lis
12210 74 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 69 74 65  t>..    /// <ite
12220 6d 3e 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  m>If the input i
12230 73 20 6e 6f 74 20 61 20 53 71 6c 53 65 6c 65 63  s not a SqlSelec
12240 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 74 20 61  tStatement, it a
12250 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
12260 69 6e 70 75 74 0d 0a 20 20 20 20 2f 2f 2f 20 69  input..    /// i
12270 73 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 65  s a collection e
12280 78 70 72 65 73 73 69 6f 6e 2c 20 61 6e 64 20 63  xpression, and c
12290 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 71 6c  reates a new Sql
122a0 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 20  SelectStatement 
122b0 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  </item>..    ///
122c0 20 3c 2f 6c 69 73 74 3e 0d 0a 20 20 20 20 2f 2f   </list>..    //
122d0 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
122e0 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
122f0 65 3d 22 69 6e 70 75 74 45 78 70 72 65 73 73 69  e="inputExpressi
12300 6f 6e 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  on"></param>..  
12310 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
12320 65 3d 22 69 6e 70 75 74 56 61 72 4e 61 6d 65 22  e="inputVarName"
12330 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  ></param>..    /
12340 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
12350 69 6e 70 75 74 56 61 72 54 79 70 65 22 3e 3c 2f  inputVarType"></
12360 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
12370 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 66 72 6f  <param name="fro
12380 6d 53 79 6d 62 6f 6c 22 3e 3c 2f 70 61 72 61 6d  mSymbol"></param
12390 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
123a0 72 6e 73 3e 41 20 3c 73 65 65 20 63 72 65 66 3d  rns>A <see cref=
123b0 22 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d  "SqlSelectStatem
123c0 65 6e 74 22 2f 3e 20 61 6e 64 20 74 68 65 20 6d  ent"/> and the m
123d0 61 69 6e 20 66 72 6f 6d 53 79 6d 62 6f 6c 0d 0a  ain fromSymbol..
123e0 20 20 20 20 2f 2f 2f 20 66 6f 72 20 74 68 69 73      /// for this
123f0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
12400 74 2e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  t.</returns>..  
12410 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65    SqlSelectState
12420 6d 65 6e 74 20 56 69 73 69 74 49 6e 70 75 74 45  ment VisitInputE
12430 78 70 72 65 73 73 69 6f 6e 28 44 62 45 78 70 72  xpression(DbExpr
12440 65 73 73 69 6f 6e 20 69 6e 70 75 74 45 78 70 72  ession inputExpr
12450 65 73 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  ession,..       
12460 20 73 74 72 69 6e 67 20 69 6e 70 75 74 56 61 72   string inputVar
12470 4e 61 6d 65 2c 20 54 79 70 65 55 73 61 67 65 20  Name, TypeUsage 
12480 69 6e 70 75 74 56 61 72 54 79 70 65 2c 20 6f 75  inputVarType, ou
12490 74 20 53 79 6d 62 6f 6c 20 66 72 6f 6d 53 79 6d  t Symbol fromSym
124a0 62 6f 6c 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  bol)..    {..   
124b0 20 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74     SqlSelectStat
124c0 65 6d 65 6e 74 20 72 65 73 75 6c 74 3b 0d 0a 20  ement result;.. 
124d0 20 20 20 20 20 49 53 71 6c 46 72 61 67 6d 65 6e       ISqlFragmen
124e0 74 20 73 71 6c 46 72 61 67 6d 65 6e 74 20 3d 20  t sqlFragment = 
124f0 69 6e 70 75 74 45 78 70 72 65 73 73 69 6f 6e 2e  inputExpression.
12500 41 63 63 65 70 74 28 74 68 69 73 29 3b 0d 0a 20  Accept(this);.. 
12510 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 73 71       result = sq
12520 6c 46 72 61 67 6d 65 6e 74 20 61 73 20 53 71 6c  lFragment as Sql
12530 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 3b  SelectStatement;
12540 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 72 65  ....      if (re
12550 73 75 6c 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  sult == null).. 
12560 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
12570 72 65 73 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c  result = new Sql
12580 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 28  SelectStatement(
12590 29 3b 0d 0a 20 20 20 20 20 20 20 20 57 72 61 70  );..        Wrap
125a0 4e 6f 6e 51 75 65 72 79 45 78 74 65 6e 74 28 72  NonQueryExtent(r
125b0 65 73 75 6c 74 2c 20 73 71 6c 46 72 61 67 6d 65  esult, sqlFragme
125c0 6e 74 2c 20 69 6e 70 75 74 45 78 70 72 65 73 73  nt, inputExpress
125d0 69 6f 6e 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69  ion.ExpressionKi
125e0 6e 64 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  nd);..      }...
125f0 0a 20 20 20 20 20 20 69 66 20 28 72 65 73 75 6c  .      if (resul
12600 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73 2e 43 6f  t.FromExtents.Co
12610 75 6e 74 20 3d 3d 20 30 29 0d 0a 20 20 20 20 20  unt == 0)..     
12620 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 69   {..        // i
12630 6e 70 75 74 20 77 61 73 20 61 6e 20 65 78 74 65  nput was an exte
12640 6e 74 0d 0a 20 20 20 20 20 20 20 20 66 72 6f 6d  nt..        from
12650 53 79 6d 62 6f 6c 20 3d 20 6e 65 77 20 53 79 6d  Symbol = new Sym
12660 62 6f 6c 28 69 6e 70 75 74 56 61 72 4e 61 6d 65  bol(inputVarName
12670 2c 20 69 6e 70 75 74 56 61 72 54 79 70 65 29 3b  , inputVarType);
12680 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
12690 20 65 6c 73 65 20 69 66 20 28 72 65 73 75 6c 74   else if (result
126a0 2e 46 72 6f 6d 45 78 74 65 6e 74 73 2e 43 6f 75  .FromExtents.Cou
126b0 6e 74 20 3d 3d 20 31 29 0d 0a 20 20 20 20 20 20  nt == 1)..      
126c0 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 69 6e  {..        // in
126d0 70 75 74 20 77 61 73 20 46 69 6c 74 65 72 2f 47  put was Filter/G
126e0 72 6f 75 70 42 79 2f 50 72 6f 6a 65 63 74 2f 4f  roupBy/Project/O
126f0 72 64 65 72 42 79 0d 0a 20 20 20 20 20 20 20 20  rderBy..        
12700 2f 2f 20 77 65 20 61 72 65 20 6c 69 6b 65 6c 79  // we are likely
12710 20 74 6f 20 72 65 75 73 65 20 74 68 69 73 20 73   to reuse this s
12720 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 20  tatement...     
12730 20 20 20 66 72 6f 6d 53 79 6d 62 6f 6c 20 3d 20     fromSymbol = 
12740 72 65 73 75 6c 74 2e 46 72 6f 6d 45 78 74 65 6e  result.FromExten
12750 74 73 5b 30 5d 3b 0d 0a 20 20 20 20 20 20 7d 0d  ts[0];..      }.
12760 0a 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20  .      else..   
12770 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f     {..        //
12780 20 69 6e 70 75 74 20 77 61 73 20 61 20 6a 6f 69   input was a joi
12790 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 77  n...        // w
127a0 65 20 61 72 65 20 72 65 75 73 69 6e 67 20 74 68  e are reusing th
127b0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
127c0 6e 74 20 70 72 6f 64 75 63 65 64 20 62 79 20 61  nt produced by a
127d0 20 4a 6f 69 6e 20 6e 6f 64 65 0d 0a 20 20 20 20   Join node..    
127e0 20 20 20 20 2f 2f 20 77 65 20 6e 65 65 64 20 74      // we need t
127f0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 72 69  o remove the ori
12800 67 69 6e 61 6c 20 65 78 74 65 6e 74 73 2c 20 61  ginal extents, a
12810 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65 6d 20  nd replace them 
12820 77 69 74 68 20 61 0d 0a 20 20 20 20 20 20 20 20  with a..        
12830 2f 2f 20 6e 65 77 20 65 78 74 65 6e 74 20 77 69  // new extent wi
12840 74 68 20 6a 75 73 74 20 74 68 65 20 4a 6f 69 6e  th just the Join
12850 20 73 79 6d 62 6f 6c 2e 0d 0a 20 20 20 20 20 20   symbol...      
12860 20 20 4a 6f 69 6e 53 79 6d 62 6f 6c 20 6a 6f 69    JoinSymbol joi
12870 6e 53 79 6d 62 6f 6c 20 3d 20 6e 65 77 20 4a 6f  nSymbol = new Jo
12880 69 6e 53 79 6d 62 6f 6c 28 69 6e 70 75 74 56 61  inSymbol(inputVa
12890 72 4e 61 6d 65 2c 20 69 6e 70 75 74 56 61 72 54  rName, inputVarT
128a0 79 70 65 2c 20 72 65 73 75 6c 74 2e 46 72 6f 6d  ype, result.From
128b0 45 78 74 65 6e 74 73 29 3b 0d 0a 20 20 20 20 20  Extents);..     
128c0 20 20 20 6a 6f 69 6e 53 79 6d 62 6f 6c 2e 46 6c     joinSymbol.Fl
128d0 61 74 74 65 6e 65 64 45 78 74 65 6e 74 4c 69 73  attenedExtentLis
128e0 74 20 3d 20 72 65 73 75 6c 74 2e 41 6c 6c 4a 6f  t = result.AllJo
128f0 69 6e 45 78 74 65 6e 74 73 3b 0d 0a 0d 0a 20 20  inExtents;....  
12900 20 20 20 20 20 20 66 72 6f 6d 53 79 6d 62 6f 6c        fromSymbol
12910 20 3d 20 6a 6f 69 6e 53 79 6d 62 6f 6c 3b 0d 0a   = joinSymbol;..
12920 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 46          result.F
12930 72 6f 6d 45 78 74 65 6e 74 73 2e 43 6c 65 61 72  romExtents.Clear
12940 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73  ();..        res
12950 75 6c 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73 2e  ult.FromExtents.
12960 41 64 64 28 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b  Add(fromSymbol);
12970 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12980 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
12990 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
129a0 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
129b0 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66     /// <see cref
129c0 3d 22 56 69 73 69 74 28 44 62 49 73 45 6d 70 74  ="Visit(DbIsEmpt
129d0 79 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e 0d  yExpression)"/>.
129e0 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
129f0 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
12a00 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70  ram name="e"></p
12a10 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
12a20 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 65 67 61  param name="nega
12a30 74 65 22 3e 57 61 73 20 74 68 65 20 70 61 72 65  te">Was the pare
12a40 6e 74 20 61 20 44 62 4e 6f 74 45 78 70 72 65 73  nt a DbNotExpres
12a50 73 69 6f 6e 3f 3c 2f 70 61 72 61 6d 3e 0d 0a 20  sion?</param>.. 
12a60 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
12a70 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
12a80 53 71 6c 42 75 69 6c 64 65 72 20 56 69 73 69 74  SqlBuilder Visit
12a90 49 73 45 6d 70 74 79 45 78 70 72 65 73 73 69 6f  IsEmptyExpressio
12aa0 6e 28 44 62 49 73 45 6d 70 74 79 45 78 70 72 65  n(DbIsEmptyExpre
12ab0 73 73 69 6f 6e 20 65 2c 20 62 6f 6f 6c 20 6e 65  ssion e, bool ne
12ac0 67 61 74 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  gate)..    {..  
12ad0 20 20 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72      SqlBuilder r
12ae0 65 73 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42  esult = new SqlB
12af0 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20  uilder();..     
12b00 20 69 66 20 28 21 6e 65 67 61 74 65 29 0d 0a 20   if (!negate).. 
12b10 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
12b20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 20  result.Append(" 
12b30 4e 4f 54 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  NOT");..      }.
12b40 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70  .      result.Ap
12b50 70 65 6e 64 28 22 20 45 58 49 53 54 53 20 28 22  pend(" EXISTS ("
12b60 29 3b 0d 0a 20 20 20 20 20 20 72 65 73 75 6c 74  );..      result
12b70 2e 41 70 70 65 6e 64 28 56 69 73 69 74 45 78 70  .Append(VisitExp
12b80 72 65 73 73 69 6f 6e 45 6e 73 75 72 65 53 71 6c  ressionEnsureSql
12b90 53 74 61 74 65 6d 65 6e 74 28 65 2e 41 72 67 75  Statement(e.Argu
12ba0 6d 65 6e 74 29 29 3b 0d 0a 20 20 20 20 20 20 72  ment));..      r
12bb0 65 73 75 6c 74 2e 41 70 70 65 6e 64 4c 69 6e 65  esult.AppendLine
12bc0 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 73 75 6c  ();..      resul
12bd0 74 2e 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a  t.Append(")");..
12be0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ..      return r
12bf0 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  esult;..    }...
12c00 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
12c10 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 72  ary>..    /// Tr
12c20 61 6e 73 6c 61 74 65 20 61 20 4e 65 77 49 6e 73  anslate a NewIns
12c30 74 61 6e 63 65 28 45 6c 65 6d 65 6e 74 28 58 29  tance(Element(X)
12c40 29 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74  ) expression int
12c50 6f 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 22 73 65  o..    ///   "se
12c60 6c 65 63 74 20 74 6f 70 28 31 29 20 2a 20 66 72  lect top(1) * fr
12c70 6f 6d 20 58 22 0d 0a 20 20 20 20 2f 2f 2f 20 3c  om X"..    /// <
12c80 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
12c90 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
12ca0 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  e"></param>..   
12cb0 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f   /// <returns></
12cc0 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 72  returns>..    pr
12cd0 69 76 61 74 65 20 49 53 71 6c 46 72 61 67 6d 65  ivate ISqlFragme
12ce0 6e 74 20 56 69 73 69 74 43 6f 6c 6c 65 63 74 69  nt VisitCollecti
12cf0 6f 6e 43 6f 6e 73 74 72 75 63 74 6f 72 28 44 62  onConstructor(Db
12d00 4e 65 77 49 6e 73 74 61 6e 63 65 45 78 70 72 65  NewInstanceExpre
12d10 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d  ssion e)..    {.
12d20 0a 20 20 20 20 20 20 44 65 62 75 67 2e 41 73 73  .      Debug.Ass
12d30 65 72 74 28 65 2e 41 72 67 75 6d 65 6e 74 73 2e  ert(e.Arguments.
12d40 43 6f 75 6e 74 20 3c 3d 20 31 29 3b 0d 0a 0d 0a  Count <= 1);....
12d50 20 20 20 20 20 20 69 66 20 28 65 2e 41 72 67 75        if (e.Argu
12d60 6d 65 6e 74 73 2e 43 6f 75 6e 74 20 3d 3d 20 31  ments.Count == 1
12d70 20 26 26 20 65 2e 41 72 67 75 6d 65 6e 74 73 5b   && e.Arguments[
12d80 30 5d 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e  0].ExpressionKin
12d90 64 20 3d 3d 20 44 62 45 78 70 72 65 73 73 69 6f  d == DbExpressio
12da0 6e 4b 69 6e 64 2e 45 6c 65 6d 65 6e 74 29 0d 0a  nKind.Element)..
12db0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12dc0 20 44 62 45 6c 65 6d 65 6e 74 45 78 70 72 65 73   DbElementExpres
12dd0 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 45 78 70 72  sion elementExpr
12de0 20 3d 20 65 2e 41 72 67 75 6d 65 6e 74 73 5b 30   = e.Arguments[0
12df0 5d 20 61 73 20 44 62 45 6c 65 6d 65 6e 74 45 78  ] as DbElementEx
12e00 70 72 65 73 73 69 6f 6e 3b 0d 0a 20 20 20 20 20  pression;..     
12e10 20 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74     SqlSelectStat
12e20 65 6d 65 6e 74 20 72 65 73 75 6c 74 20 3d 20 56  ement result = V
12e30 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 45 6e  isitExpressionEn
12e40 73 75 72 65 53 71 6c 53 74 61 74 65 6d 65 6e 74  sureSqlStatement
12e50 28 65 6c 65 6d 65 6e 74 45 78 70 72 2e 41 72 67  (elementExpr.Arg
12e60 75 6d 65 6e 74 29 3b 0d 0a 0d 0a 20 20 20 20 20  ument);....     
12e70 20 20 20 69 66 20 28 21 49 73 43 6f 6d 70 61 74     if (!IsCompat
12e80 69 62 6c 65 28 72 65 73 75 6c 74 2c 20 44 62 45  ible(result, DbE
12e90 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 45 6c  xpressionKind.El
12ea0 65 6d 65 6e 74 29 29 0d 0a 20 20 20 20 20 20 20  ement))..       
12eb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   {..          Sy
12ec0 6d 62 6f 6c 20 66 72 6f 6d 53 79 6d 62 6f 6c 3b  mbol fromSymbol;
12ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 54 79 70 65  ..          Type
12ee0 55 73 61 67 65 20 69 6e 70 75 74 54 79 70 65 20  Usage inputType 
12ef0 3d 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72  = MetadataHelper
12f00 73 2e 47 65 74 45 6c 65 6d 65 6e 74 54 79 70 65  s.GetElementType
12f10 55 73 61 67 65 28 65 6c 65 6d 65 6e 74 45 78 70  Usage(elementExp
12f20 72 2e 41 72 67 75 6d 65 6e 74 2e 52 65 73 75 6c  r.Argument.Resul
12f30 74 54 79 70 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  tType);....     
12f40 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 43 72       result = Cr
12f50 65 61 74 65 4e 65 77 53 65 6c 65 63 74 53 74 61  eateNewSelectSta
12f60 74 65 6d 65 6e 74 28 72 65 73 75 6c 74 2c 20 22  tement(result, "
12f70 65 6c 65 6d 65 6e 74 22 2c 20 69 6e 70 75 74 54  element", inputT
12f80 79 70 65 2c 20 6f 75 74 20 66 72 6f 6d 53 79 6d  ype, out fromSym
12f90 62 6f 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  bol);..         
12fa0 20 41 64 64 46 72 6f 6d 53 79 6d 62 6f 6c 28 72   AddFromSymbol(r
12fb0 65 73 75 6c 74 2c 20 22 65 6c 65 6d 65 6e 74 22  esult, "element"
12fc0 2c 20 66 72 6f 6d 53 79 6d 62 6f 6c 2c 20 66 61  , fromSymbol, fa
12fd0 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  lse);..        }
12fe0 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  ..        result
12ff0 2e 54 6f 70 20 3d 20 6e 65 77 20 54 6f 70 43 6c  .Top = new TopCl
13000 61 75 73 65 28 31 2c 20 66 61 6c 73 65 29 3b 0d  ause(1, false);.
13010 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13020 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 20 20 7d  result;..      }
13030 0d 0a 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 4f  ......      // O
13040 74 68 65 72 77 69 73 65 20 73 69 6d 70 6c 79 20  therwise simply 
13050 62 75 69 6c 64 20 74 68 69 73 20 6f 75 74 20 61  build this out a
13060 73 20 61 20 75 6e 69 6f 6e 2d 61 6c 6c 20 6c 61  s a union-all la
13070 64 64 65 72 0d 0a 20 20 20 20 20 20 43 6f 6c 6c  dder..      Coll
13080 65 63 74 69 6f 6e 54 79 70 65 20 63 6f 6c 6c 65  ectionType colle
13090 63 74 69 6f 6e 54 79 70 65 20 3d 20 4d 65 74 61  ctionType = Meta
130a0 64 61 74 61 48 65 6c 70 65 72 73 2e 47 65 74 45  dataHelpers.GetE
130b0 64 6d 54 79 70 65 3c 43 6f 6c 6c 65 63 74 69 6f  dmType<Collectio
130c0 6e 54 79 70 65 3e 28 65 2e 52 65 73 75 6c 74 54  nType>(e.ResultT
130d0 79 70 65 29 3b 0d 0a 20 20 20 20 20 20 44 65 62  ype);..      Deb
130e0 75 67 2e 41 73 73 65 72 74 28 63 6f 6c 6c 65 63  ug.Assert(collec
130f0 74 69 6f 6e 54 79 70 65 20 21 3d 20 6e 75 6c 6c  tionType != null
13100 29 3b 0d 0a 20 20 20 20 20 20 62 6f 6f 6c 20 69  );..      bool i
13110 73 53 63 61 6c 61 72 45 6c 65 6d 65 6e 74 20 3d  sScalarElement =
13120 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73   MetadataHelpers
13130 2e 49 73 50 72 69 6d 69 74 69 76 65 54 79 70 65  .IsPrimitiveType
13140 28 63 6f 6c 6c 65 63 74 69 6f 6e 54 79 70 65 2e  (collectionType.
13150 54 79 70 65 55 73 61 67 65 29 3b 0d 0a 0d 0a 20  TypeUsage);.... 
13160 20 20 20 20 20 53 71 6c 42 75 69 6c 64 65 72 20       SqlBuilder 
13170 72 65 73 75 6c 74 53 71 6c 20 3d 20 6e 65 77 20  resultSql = new 
13180 53 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20  SqlBuilder();.. 
13190 20 20 20 20 20 73 74 72 69 6e 67 20 73 65 70 61       string sepa
131a0 72 61 74 6f 72 20 3d 20 53 74 72 69 6e 67 2e 45  rator = String.E
131b0 6d 70 74 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f  mpty;....      /
131c0 2f 20 68 61 6e 64 6c 65 20 65 6d 70 74 79 20 74  / handle empty t
131d0 61 62 6c 65 0d 0a 20 20 20 20 20 20 69 66 20 28  able..      if (
131e0 65 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75 6e  e.Arguments.Coun
131f0 74 20 3d 3d 20 30 29 0d 0a 20 20 20 20 20 20 7b  t == 0)..      {
13200 0d 0a 20 20 20 20 20 20 20 20 44 65 62 75 67 2e  ..        Debug.
13210 41 73 73 65 72 74 28 69 73 53 63 61 6c 61 72 45  Assert(isScalarE
13220 6c 65 6d 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20  lement);..      
13230 20 20 72 65 73 75 6c 74 53 71 6c 2e 41 70 70 65    resultSql.Appe
13240 6e 64 28 22 20 53 45 4c 45 43 54 20 4e 55 4c 4c  nd(" SELECT NULL
13250 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73  ");..        res
13260 75 6c 74 53 71 6c 2e 41 70 70 65 6e 64 28 22 20  ultSql.Append(" 
13270 41 53 20 58 20 46 52 4f 4d 20 28 53 45 4c 45 43  AS X FROM (SELEC
13280 54 20 31 29 20 41 53 20 59 20 57 48 45 52 45 20  T 1) AS Y WHERE 
13290 31 3d 30 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  1=0");..      }.
132a0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
132b0 20 28 44 62 45 78 70 72 65 73 73 69 6f 6e 20 61   (DbExpression a
132c0 72 67 20 69 6e 20 65 2e 41 72 67 75 6d 65 6e 74  rg in e.Argument
132d0 73 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  s)..      {..   
132e0 20 20 20 20 20 72 65 73 75 6c 74 53 71 6c 2e 41       resultSql.A
132f0 70 70 65 6e 64 28 73 65 70 61 72 61 74 6f 72 29  ppend(separator)
13300 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  ;..        resul
13310 74 53 71 6c 2e 41 70 70 65 6e 64 28 22 20 53 45  tSql.Append(" SE
13320 4c 45 43 54 20 22 29 3b 0d 0a 20 20 20 20 20 20  LECT ");..      
13330 20 20 72 65 73 75 6c 74 53 71 6c 2e 41 70 70 65    resultSql.Appe
13340 6e 64 28 61 72 67 2e 41 63 63 65 70 74 28 74 68  nd(arg.Accept(th
13350 69 73 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f  is));..        /
13360 2f 20 46 6f 72 20 73 63 61 6c 61 72 20 65 6c 65  / For scalar ele
13370 6d 65 6e 74 73 2c 20 6e 6f 20 61 6c 69 61 73 20  ments, no alias 
13380 69 73 20 61 70 70 65 6e 64 65 64 20 79 65 74 2e  is appended yet.
13390 20 41 64 64 20 74 68 69 73 2e 0d 0a 20 20 20 20   Add this...    
133a0 20 20 20 20 69 66 20 28 69 73 53 63 61 6c 61 72      if (isScalar
133b0 45 6c 65 6d 65 6e 74 29 0d 0a 20 20 20 20 20 20  Element)..      
133c0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72    {..          r
133d0 65 73 75 6c 74 53 71 6c 2e 41 70 70 65 6e 64 28  esultSql.Append(
133e0 22 20 41 53 20 58 20 22 29 3b 0d 0a 20 20 20 20  " AS X ");..    
133f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 73      }..        s
13400 65 70 61 72 61 74 6f 72 20 3d 20 22 20 55 4e 49  eparator = " UNI
13410 4f 4e 20 41 4c 4c 20 22 3b 0d 0a 20 20 20 20 20  ON ALL ";..     
13420 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
13430 72 6e 20 72 65 73 75 6c 74 53 71 6c 3b 0d 0a 20  rn resultSql;.. 
13440 20 20 20 7d 0d 0a 0d 0a 0d 0a 20 20 20 20 2f 2f     }......    //
13450 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
13460 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22   /// <see cref="
13470 56 69 73 69 74 28 44 62 49 73 4e 75 6c 6c 45 78  Visit(DbIsNullEx
13480 70 72 65 73 73 69 6f 6e 29 22 2f 3e 0d 0a 20 20  pression)"/>..  
13490 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
134a0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
134b0 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61   name="e"></para
134c0 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
134d0 61 6d 20 6e 61 6d 65 3d 22 6e 65 67 61 74 65 22  am name="negate"
134e0 3e 57 61 73 20 74 68 65 20 70 61 72 65 6e 74 20  >Was the parent 
134f0 61 20 44 62 4e 6f 74 45 78 70 72 65 73 73 69 6f  a DbNotExpressio
13500 6e 3f 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  n?</param>..    
13510 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72  /// <returns></r
13520 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 53 71 6c  eturns>..    Sql
13530 42 75 69 6c 64 65 72 20 56 69 73 69 74 49 73 4e  Builder VisitIsN
13540 75 6c 6c 45 78 70 72 65 73 73 69 6f 6e 28 44 62  ullExpression(Db
13550 49 73 4e 75 6c 6c 45 78 70 72 65 73 73 69 6f 6e  IsNullExpression
13560 20 65 2c 20 62 6f 6f 6c 20 6e 65 67 61 74 65 29   e, bool negate)
13570 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53  ..    {..      S
13580 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c 74  qlBuilder result
13590 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64 65   = new SqlBuilde
135a0 72 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 73 75  r();..      resu
135b0 6c 74 2e 41 70 70 65 6e 64 28 65 2e 41 72 67 75  lt.Append(e.Argu
135c0 6d 65 6e 74 2e 41 63 63 65 70 74 28 74 68 69 73  ment.Accept(this
135d0 29 29 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 21  ));..      if (!
135e0 6e 65 67 61 74 65 29 0d 0a 20 20 20 20 20 20 7b  negate)..      {
135f0 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  ..        result
13600 2e 41 70 70 65 6e 64 28 22 20 49 53 20 4e 55 4c  .Append(" IS NUL
13610 4c 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  L");..      }.. 
13620 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
13630 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75   {..        resu
13640 6c 74 2e 41 70 70 65 6e 64 28 22 20 49 53 20 4e  lt.Append(" IS N
13650 4f 54 20 4e 55 4c 4c 22 29 3b 0d 0a 20 20 20 20  OT NULL");..    
13660 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
13670 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20  urn result;..   
13680 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
13690 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
136a0 20 54 68 69 73 20 68 61 6e 64 6c 65 73 20 74 68   This handles th
136b0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  e processing of 
136c0 6a 6f 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  join expressions
136d0 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 65  ...    /// The e
136e0 78 74 65 6e 74 73 20 6f 6e 20 61 20 6c 65 66 74  xtents on a left
136f0 20 73 70 69 6e 65 20 61 72 65 20 66 6c 61 74 74   spine are flatt
13700 65 6e 65 64 2c 20 77 68 69 6c 65 20 6a 6f 69 6e  ened, while join
13710 73 0d 0a 20 20 20 20 2f 2f 2f 20 6e 6f 74 20 6f  s..    /// not o
13720 6e 20 74 68 65 20 6c 65 66 74 20 73 70 69 6e 65  n the left spine
13730 20 67 69 76 65 20 72 69 73 65 20 74 6f 20 6e 65   give rise to ne
13740 77 20 6e 65 73 74 65 64 20 73 75 62 20 71 75 65  w nested sub que
13750 72 69 65 73 2e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a  ries...    ///..
13760 20 20 20 20 2f 2f 2f 20 4a 6f 69 6e 73 20 77 6f      /// Joins wo
13770 72 6b 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  rk differently f
13780 72 6f 6d 20 74 68 65 20 72 65 73 74 20 6f 66 20  rom the rest of 
13790 74 68 65 20 76 69 73 69 74 69 6e 67 2c 20 69 6e  the visiting, in
137a0 20 74 68 61 74 0d 0a 20 20 20 20 2f 2f 2f 20 74   that..    /// t
137b0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 20  he parent (i.e. 
137c0 74 68 65 20 6a 6f 69 6e 20 6e 6f 64 65 29 20 63  the join node) c
137d0 72 65 61 74 65 73 20 74 68 65 20 53 71 6c 53 65  reates the SqlSe
137e0 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 0d 0a 20  lectStatement.. 
137f0 20 20 20 2f 2f 2f 20 66 6f 72 20 74 68 65 20 63     /// for the c
13800 68 69 6c 64 72 65 6e 20 74 6f 20 75 73 65 2e 0d  hildren to use..
13810 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f  .    ///..    //
13820 2f 20 54 68 65 20 22 70 61 72 61 6d 65 74 65 72  / The "parameter
13830 22 20 49 73 49 6e 4a 6f 69 6e 43 6f 6e 74 65 78  " IsInJoinContex
13840 74 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  t indicates whet
13850 68 65 72 20 61 20 63 68 69 6c 64 20 65 78 74 65  her a child exte
13860 6e 74 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 2f  nt should..    /
13870 2f 2f 20 61 64 64 20 69 74 73 20 73 74 75 66 66  // add its stuff
13880 20 74 6f 20 74 68 65 20 65 78 69 73 74 69 6e 67   to the existing
13890 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d   SqlSelectStatem
138a0 65 6e 74 2c 20 6f 72 20 63 72 65 61 74 65 20 61  ent, or create a
138b0 20 6e 65 77 20 53 71 6c 53 65 6c 65 63 74 53 74   new SqlSelectSt
138c0 61 74 65 6d 65 6e 74 0d 0a 20 20 20 20 2f 2f 2f  atement..    ///
138d0 20 42 79 20 70 61 73 73 69 6e 67 20 74 72 75 65   By passing true
138e0 2c 20 77 65 20 61 73 6b 20 74 68 65 20 63 68 69  , we ask the chi
138f0 6c 64 72 65 6e 20 74 6f 20 61 64 64 20 74 68 65  ldren to add the
13900 6d 73 65 6c 76 65 73 20 74 6f 20 74 68 65 20 70  mselves to the p
13910 61 72 65 6e 74 20 6a 6f 69 6e 2c 0d 0a 20 20 20  arent join,..   
13920 20 2f 2f 2f 20 62 79 20 70 61 73 73 69 6e 67 20   /// by passing 
13930 66 61 6c 73 65 2c 20 77 65 20 61 73 6b 20 74 68  false, we ask th
13940 65 20 63 68 69 6c 64 72 65 6e 20 74 6f 20 63 72  e children to cr
13950 65 61 74 65 20 6e 65 77 20 53 65 6c 65 63 74 20  eate new Select 
13960 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 0d 0a  statements for..
13970 20 20 20 20 2f 2f 2f 20 74 68 65 6d 73 65 6c 76      /// themselv
13980 65 73 2e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20  es...    ///..  
13990 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f    /// This metho
139a0 64 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  d is called from
139b0 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69 73 69   <see cref="Visi
139c0 74 28 44 62 41 70 70 6c 79 45 78 70 72 65 73 73  t(DbApplyExpress
139d0 69 6f 6e 29 22 2f 3e 20 61 6e 64 0d 0a 20 20 20  ion)"/> and..   
139e0 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22   /// <see cref="
139f0 56 69 73 69 74 28 44 62 4a 6f 69 6e 45 78 70 72  Visit(DbJoinExpr
13a00 65 73 73 69 6f 6e 29 22 2f 3e 2e 0d 0a 20 20 20  ession)"/>...   
13a10 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
13a20 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
13a30 6e 61 6d 65 3d 22 69 6e 70 75 74 73 22 3e 3c 2f  name="inputs"></
13a40 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
13a50 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6a 6f 69  <param name="joi
13a60 6e 4b 69 6e 64 22 3e 3c 2f 70 61 72 61 6d 3e 0d  nKind"></param>.
13a70 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
13a80 6e 61 6d 65 3d 22 6a 6f 69 6e 53 74 72 69 6e 67  name="joinString
13a90 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  "></param>..    
13aa0 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
13ab0 22 6a 6f 69 6e 43 6f 6e 64 69 74 69 6f 6e 22 3e  "joinCondition">
13ac0 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
13ad0 2f 20 3c 72 65 74 75 72 6e 73 3e 20 41 20 3c 73  / <returns> A <s
13ae0 65 65 20 63 72 65 66 3d 22 53 71 6c 53 65 6c 65  ee cref="SqlSele
13af0 63 74 53 74 61 74 65 6d 65 6e 74 22 2f 3e 3c 2f  ctStatement"/></
13b00 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 49 53  returns>..    IS
13b10 71 6c 46 72 61 67 6d 65 6e 74 20 56 69 73 69 74  qlFragment Visit
13b20 4a 6f 69 6e 45 78 70 72 65 73 73 69 6f 6e 28 49  JoinExpression(I
13b30 4c 69 73 74 3c 44 62 45 78 70 72 65 73 73 69 6f  List<DbExpressio
13b40 6e 42 69 6e 64 69 6e 67 3e 20 69 6e 70 75 74 73  nBinding> inputs
13b50 2c 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69  , DbExpressionKi
13b60 6e 64 20 6a 6f 69 6e 4b 69 6e 64 2c 0d 0a 20 20  nd joinKind,..  
13b70 20 20 20 20 20 20 73 74 72 69 6e 67 20 6a 6f 69        string joi
13b80 6e 53 74 72 69 6e 67 2c 20 44 62 45 78 70 72 65  nString, DbExpre
13b90 73 73 69 6f 6e 20 6a 6f 69 6e 43 6f 6e 64 69 74  ssion joinCondit
13ba0 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ion)..    {..   
13bb0 20 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74     SqlSelectStat
13bc0 65 6d 65 6e 74 20 72 65 73 75 6c 74 3b 0d 0a 20  ement result;.. 
13bd0 20 20 20 20 20 2f 2f 20 49 66 20 74 68 65 20 70       // If the p
13be0 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 6a  arent is not a j
13bf0 6f 69 6e 28 20 6f 72 20 73 61 79 73 20 74 68 61  oin( or says tha
13c00 74 20 69 74 20 69 73 20 6e 6f 74 29 2c 0d 0a 20  t it is not),.. 
13c10 20 20 20 20 20 2f 2f 20 77 65 20 73 68 6f 75 6c       // we shoul
13c20 64 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 53  d create a new S
13c30 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e  qlSelectStatemen
13c40 74 2e 0d 0a 20 20 20 20 20 20 2f 2f 20 6f 74 68  t...      // oth
13c50 65 72 77 69 73 65 2c 20 77 65 20 61 64 64 20 6f  erwise, we add o
13c60 75 72 20 63 68 69 6c 64 20 65 78 74 65 6e 74 73  ur child extents
13c70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 27 73   to the parent's
13c80 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0d 0a 20   FROM clause... 
13c90 20 20 20 20 20 69 66 20 28 21 49 73 50 61 72 65       if (!IsPare
13ca0 6e 74 41 4a 6f 69 6e 29 0d 0a 20 20 20 20 20 20  ntAJoin)..      
13cb0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  {..        resul
13cc0 74 20 3d 20 6e 65 77 20 53 71 6c 53 65 6c 65 63  t = new SqlSelec
13cd0 74 53 74 61 74 65 6d 65 6e 74 28 29 3b 0d 0a 20  tStatement();.. 
13ce0 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 6c         result.Al
13cf0 6c 4a 6f 69 6e 45 78 74 65 6e 74 73 20 3d 20 6e  lJoinExtents = n
13d00 65 77 20 4c 69 73 74 3c 53 79 6d 62 6f 6c 3e 28  ew List<Symbol>(
13d10 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 65 6c 65  );..        sele
13d20 63 74 53 74 61 74 65 6d 65 6e 74 53 74 61 63 6b  ctStatementStack
13d30 2e 50 75 73 68 28 72 65 73 75 6c 74 29 3b 0d 0a  .Push(result);..
13d40 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 65        }..      e
13d50 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  lse..      {..  
13d60 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 43        result = C
13d70 75 72 72 65 6e 74 53 65 6c 65 63 74 53 74 61 74  urrentSelectStat
13d80 65 6d 65 6e 74 3b 0d 0a 20 20 20 20 20 20 7d 0d  ement;..      }.
13d90 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 50 72 6f 63  ...      // Proc
13da0 65 73 73 20 65 61 63 68 20 6f 66 20 74 68 65 20  ess each of the 
13db0 69 6e 70 75 74 73 2c 20 61 6e 64 20 74 68 65 6e  inputs, and then
13dc0 20 74 68 65 20 6a 6f 69 6e 43 6f 6e 64 69 74 69   the joinConditi
13dd0 6f 6e 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  on if it exists.
13de0 0d 0a 20 20 20 20 20 20 2f 2f 20 49 74 20 77 6f  ..      // It wo
13df0 75 6c 64 20 62 65 20 6e 69 63 65 20 69 66 20 77  uld be nice if w
13e00 65 20 63 6f 75 6c 64 20 63 61 6c 6c 20 56 69 73  e could call Vis
13e10 69 74 49 6e 70 75 74 45 78 70 72 65 73 73 69 6f  itInputExpressio
13e20 6e 20 2d 20 74 68 61 74 20 77 6f 75 6c 64 0d 0a  n - that would..
13e30 20 20 20 20 20 20 2f 2f 20 61 76 6f 69 64 20 73        // avoid s
13e40 6f 6d 65 20 63 6f 64 65 20 64 75 70 6c 69 63 61  ome code duplica
13e50 74 69 6f 6e 0d 0a 20 20 20 20 20 20 2f 2f 20 62  tion..      // b
13e60 75 74 20 74 68 65 20 4a 6f 69 6e 20 70 6f 73 74  ut the Join post
13e70 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 65  processing is me
13e80 73 73 79 20 61 6e 64 20 70 72 65 76 65 6e 74 73  ssy and prevents
13e90 20 74 68 69 73 20 72 65 75 73 65 2e 0d 0a 20 20   this reuse...  
13ea0 20 20 20 20 73 79 6d 62 6f 6c 54 61 62 6c 65 2e      symbolTable.
13eb0 45 6e 74 65 72 53 63 6f 70 65 28 29 3b 0d 0a 0d  EnterScope();...
13ec0 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 65  .      string se
13ed0 70 61 72 61 74 6f 72 20 3d 20 53 74 72 69 6e 67  parator = String
13ee0 2e 45 6d 70 74 79 3b 0d 0a 20 20 20 20 20 20 62  .Empty;..      b
13ef0 6f 6f 6c 20 69 73 4c 65 66 74 4d 6f 73 74 49 6e  ool isLeftMostIn
13f00 70 75 74 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20  put = true;..   
13f10 20 20 20 69 6e 74 20 69 6e 70 75 74 43 6f 75 6e     int inputCoun
13f20 74 20 3d 20 69 6e 70 75 74 73 2e 43 6f 75 6e 74  t = inputs.Count
13f30 3b 0d 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e  ;..      for (in
13f40 74 20 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c  t idx = 0; idx <
13f50 20 69 6e 70 75 74 43 6f 75 6e 74 3b 20 69 64 78   inputCount; idx
13f60 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ++)..      {..  
13f70 20 20 20 20 20 20 44 62 45 78 70 72 65 73 73 69        DbExpressi
13f80 6f 6e 42 69 6e 64 69 6e 67 20 69 6e 70 75 74 20  onBinding input 
13f90 3d 20 69 6e 70 75 74 73 5b 69 64 78 5d 3b 0d 0a  = inputs[idx];..
13fa0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 65  ..        if (se
13fb0 70 61 72 61 74 6f 72 20 21 3d 20 53 74 72 69 6e  parator != Strin
13fc0 67 2e 45 6d 70 74 79 29 0d 0a 20 20 20 20 20 20  g.Empty)..      
13fd0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72    {..          r
13fe0 65 73 75 6c 74 2e 46 72 6f 6d 2e 41 70 70 65 6e  esult.From.Appen
13ff0 64 4c 69 6e 65 28 29 3b 0d 0a 20 20 20 20 20 20  dLine();..      
14000 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 73    }..        res
14010 75 6c 74 2e 46 72 6f 6d 2e 41 70 70 65 6e 64 28  ult.From.Append(
14020 73 65 70 61 72 61 74 6f 72 20 2b 20 22 20 22 29  separator + " ")
14030 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 43 68  ;..        // Ch
14040 61 6e 67 65 20 74 68 69 73 20 69 66 20 6f 74 68  ange this if oth
14050 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  er conditions ar
14060 65 20 72 65 71 75 69 72 65 64 0d 0a 20 20 20 20  e required..    
14070 20 20 20 20 2f 2f 20 74 6f 20 66 6f 72 63 65 20      // to force 
14080 74 68 65 20 63 68 69 6c 64 20 74 6f 20 70 72 6f  the child to pro
14090 64 75 63 65 20 61 20 6e 65 73 74 65 64 20 53 71  duce a nested Sq
140a0 6c 53 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20  lStatement...   
140b0 20 20 20 20 20 62 6f 6f 6c 20 6e 65 65 64 73 4a       bool needsJ
140c0 6f 69 6e 43 6f 6e 74 65 78 74 20 3d 20 28 69 6e  oinContext = (in
140d0 70 75 74 2e 45 78 70 72 65 73 73 69 6f 6e 2e 45  put.Expression.E
140e0 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 20 3d 3d  xpressionKind ==
140f0 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e   DbExpressionKin
14100 64 2e 53 63 61 6e 29 0d 0a 20 20 20 20 20 20 20  d.Scan)..       
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 4c           || (isL
14130 65 66 74 4d 6f 73 74 49 6e 70 75 74 20 26 26 0d  eftMostInput &&.
14140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 20 28 49 73 4a 6f 69 6e 45 78 70 72       (IsJoinExpr
14170 65 73 73 69 6f 6e 28 69 6e 70 75 74 2e 45 78 70  ession(input.Exp
14180 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20  ression)..      
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
141b0 7c 20 49 73 41 70 70 6c 79 45 78 70 72 65 73 73  | IsApplyExpress
141c0 69 6f 6e 28 69 6e 70 75 74 2e 45 78 70 72 65 73  ion(input.Expres
141d0 73 69 6f 6e 29 29 29 0d 0a 20 20 20 20 20 20 20  sion)))..       
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 20 20 20 20 20 20 20 20 3b 0d 0a 0d 0a 20 20           ;....  
14200 20 20 20 20 20 20 69 73 50 61 72 65 6e 74 41 4a        isParentAJ
14210 6f 69 6e 53 74 61 63 6b 2e 50 75 73 68 28 6e 65  oinStack.Push(ne
14220 65 64 73 4a 6f 69 6e 43 6f 6e 74 65 78 74 20 3f  edsJoinContext ?
14230 20 74 72 75 65 20 3a 20 66 61 6c 73 65 29 3b 0d   true : false);.
14240 0a 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 74  .        // if t
14250 68 65 20 63 68 69 6c 64 20 72 65 75 73 65 73 20  he child reuses 
14260 6f 75 72 20 73 65 6c 65 63 74 20 73 74 61 74 65  our select state
14270 6d 65 6e 74 2c 20 69 74 20 77 69 6c 6c 20 61 70  ment, it will ap
14280 70 65 6e 64 20 74 68 65 20 66 72 6f 6d 0d 0a 20  pend the from.. 
14290 20 20 20 20 20 20 20 2f 2f 20 73 79 6d 62 6f 6c         // symbol
142a0 73 20 74 6f 20 6f 75 72 20 46 72 6f 6d 45 78 74  s to our FromExt
142b0 65 6e 74 73 20 6c 69 73 74 2e 20 20 53 6f 2c 20  ents list.  So, 
142c0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
142d0 62 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ber the..       
142e0 20 2f 2f 20 73 74 61 72 74 20 6f 66 20 74 68 65   // start of the
142f0 20 63 68 69 6c 64 27 73 20 65 6e 74 72 69 65 73   child's entries
14300 2e 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ...        int f
14310 72 6f 6d 53 79 6d 62 6f 6c 53 74 61 72 74 20 3d  romSymbolStart =
14320 20 72 65 73 75 6c 74 2e 46 72 6f 6d 45 78 74 65   result.FromExte
14330 6e 74 73 2e 43 6f 75 6e 74 3b 0d 0a 0d 0a 20 20  nts.Count;....  
14340 20 20 20 20 20 20 49 53 71 6c 46 72 61 67 6d 65        ISqlFragme
14350 6e 74 20 66 72 6f 6d 45 78 74 65 6e 74 46 72 61  nt fromExtentFra
14360 67 6d 65 6e 74 20 3d 20 69 6e 70 75 74 2e 45 78  gment = input.Ex
14370 70 72 65 73 73 69 6f 6e 2e 41 63 63 65 70 74 28  pression.Accept(
14380 74 68 69 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  this);....      
14390 20 20 69 73 50 61 72 65 6e 74 41 4a 6f 69 6e 53    isParentAJoinS
143a0 74 61 63 6b 2e 50 6f 70 28 29 3b 0d 0a 0d 0a 20  tack.Pop();.... 
143b0 20 20 20 20 20 20 20 50 72 6f 63 65 73 73 4a 6f         ProcessJo
143c0 69 6e 49 6e 70 75 74 52 65 73 75 6c 74 28 66 72  inInputResult(fr
143d0 6f 6d 45 78 74 65 6e 74 46 72 61 67 6d 65 6e 74  omExtentFragment
143e0 2c 20 72 65 73 75 6c 74 2c 20 69 6e 70 75 74 2c  , result, input,
143f0 20 66 72 6f 6d 53 79 6d 62 6f 6c 53 74 61 72 74   fromSymbolStart
14400 29 3b 0d 0a 20 20 20 20 20 20 20 20 73 65 70 61  );..        sepa
14410 72 61 74 6f 72 20 3d 20 6a 6f 69 6e 53 74 72 69  rator = joinStri
14420 6e 67 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ng;....        i
14430 73 4c 65 66 74 4d 6f 73 74 49 6e 70 75 74 20 3d  sLeftMostInput =
14440 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 7d   false;..      }
14450 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 56 69 73  ....      // Vis
14460 69 74 20 74 68 65 20 6f 6e 20 63 6c 61 75 73 65  it the on clause
14470 2f 6a 6f 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 2e  /join condition.
14480 0d 0a 20 20 20 20 20 20 73 77 69 74 63 68 20 28  ..      switch (
14490 6a 6f 69 6e 4b 69 6e 64 29 0d 0a 20 20 20 20 20  joinKind)..     
144a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65   {..        case
144b0 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e   DbExpressionKin
144c0 64 2e 46 75 6c 6c 4f 75 74 65 72 4a 6f 69 6e 3a  d.FullOuterJoin:
144d0 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 44  ..        case D
144e0 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e  bExpressionKind.
144f0 49 6e 6e 65 72 4a 6f 69 6e 3a 0d 0a 20 20 20 20  InnerJoin:..    
14500 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65      case DbExpre
14510 73 73 69 6f 6e 4b 69 6e 64 2e 4c 65 66 74 4f 75  ssionKind.LeftOu
14520 74 65 72 4a 6f 69 6e 3a 0d 0a 20 20 20 20 20 20  terJoin:..      
14530 20 20 20 20 72 65 73 75 6c 74 2e 46 72 6f 6d 2e      result.From.
14540 41 70 70 65 6e 64 28 22 20 4f 4e 20 22 29 3b 0d  Append(" ON ");.
14550 0a 20 20 20 20 20 20 20 20 20 20 69 73 50 61 72  .          isPar
14560 65 6e 74 41 4a 6f 69 6e 53 74 61 63 6b 2e 50 75  entAJoinStack.Pu
14570 73 68 28 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20  sh(false);..    
14580 20 20 20 20 20 20 72 65 73 75 6c 74 2e 46 72 6f        result.Fro
14590 6d 2e 41 70 70 65 6e 64 28 6a 6f 69 6e 43 6f 6e  m.Append(joinCon
145a0 64 69 74 69 6f 6e 2e 41 63 63 65 70 74 28 74 68  dition.Accept(th
145b0 69 73 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  is));..         
145c0 20 69 73 50 61 72 65 6e 74 41 4a 6f 69 6e 53 74   isParentAJoinSt
145d0 61 63 6b 2e 50 6f 70 28 29 3b 0d 0a 20 20 20 20  ack.Pop();..    
145e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
145f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
14600 79 6d 62 6f 6c 54 61 62 6c 65 2e 45 78 69 74 53  ymbolTable.ExitS
14610 63 6f 70 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  cope();....     
14620 20 69 66 20 28 21 49 73 50 61 72 65 6e 74 41 4a   if (!IsParentAJ
14630 6f 69 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  oin)..      {.. 
14640 20 20 20 20 20 20 20 73 65 6c 65 63 74 53 74 61         selectSta
14650 74 65 6d 65 6e 74 53 74 61 63 6b 2e 50 6f 70 28  tementStack.Pop(
14660 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  );..      }.... 
14670 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75       return resu
14680 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  lt;..    }....  
14690 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
146a0 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73  .    /// This is
146b0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 3c 73 65   called from <se
146c0 65 20 63 72 65 66 3d 22 56 69 73 69 74 4a 6f 69  e cref="VisitJoi
146d0 6e 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e 2e 0d  nExpression"/>..
146e0 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f  .    ///..    //
146f0 2f 20 54 68 69 73 20 69 73 20 72 65 73 70 6f 6e  / This is respon
14700 73 69 62 6c 65 20 66 6f 72 20 6d 61 69 6e 74 61  sible for mainta
14710 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c  ining the symbol
14720 20 74 61 62 6c 65 20 61 66 74 65 72 20 76 69 73   table after vis
14730 69 74 69 6e 67 0d 0a 20 20 20 20 2f 2f 2f 20 61  iting..    /// a
14740 20 63 68 69 6c 64 20 6f 66 20 61 20 6a 6f 69 6e   child of a join
14750 20 65 78 70 72 65 73 73 69 6f 6e 2e 0d 0a 20 20   expression...  
14760 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 54    ///..    /// T
14770 68 65 20 63 68 69 6c 64 27 73 20 73 71 6c 20 73  he child's sql s
14780 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 6e 65 65  tatement may nee
14790 64 20 74 6f 20 62 65 20 63 6f 6d 70 6c 65 74 65  d to be complete
147a0 64 2e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20  d...    ///..   
147b0 20 2f 2f 2f 20 54 68 65 20 63 68 69 6c 64 27 73   /// The child's
147c0 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
147d0 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 2f 2f 2f   one of..    ///
147e0 20 3c 6c 69 73 74 20 74 79 70 65 3d 22 6e 75 6d   <list type="num
147f0 62 65 72 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ber">..    /// <
14800 69 74 65 6d 3e 54 68 65 20 73 61 6d 65 20 61 73  item>The same as
14810 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 2d 20   the parent's - 
14820 74 68 69 73 20 69 73 20 74 72 65 61 74 65 64 20  this is treated 
14830 73 70 65 63 69 61 6c 6c 79 2e 3c 2f 69 74 65 6d  specially.</item
14840 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 69 74 65 6d  >..    /// <item
14850 3e 41 20 73 71 6c 20 73 65 6c 65 63 74 20 73 74  >A sql select st
14860 61 74 65 6d 65 6e 74 2c 20 77 68 69 63 68 20 6d  atement, which m
14870 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ay need to be co
14880 6d 70 6c 65 74 65 64 3c 2f 69 74 65 6d 3e 0d 0a  mpleted</item>..
14890 20 20 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 41 6e      /// <item>An
148a0 20 65 78 74 65 6e 74 20 2d 20 6a 75 73 74 20 63   extent - just c
148b0 6f 70 79 20 69 74 20 74 6f 20 74 68 65 20 66 72  opy it to the fr
148c0 6f 6d 20 63 6c 61 75 73 65 3c 2f 69 74 65 6d 3e  om clause</item>
148d0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e  ..    /// <item>
148e0 41 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 28 66  Anything else (f
148f0 72 6f 6d 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e  rom a collection
14900 2d 76 61 6c 75 65 64 20 65 78 70 72 65 73 73 69  -valued expressi
14910 6f 6e 29 20 2d 0d 0a 20 20 20 20 2f 2f 2f 20 75  on) -..    /// u
14920 6e 6e 65 73 74 20 61 6e 64 20 63 6f 70 79 20 69  nnest and copy i
14930 74 2e 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f  t.</item>..    /
14940 2f 2f 20 3c 2f 6c 69 73 74 3e 0d 0a 20 20 20 20  // </list>..    
14950 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 49 66 20  ///..    /// If 
14960 74 68 65 20 69 6e 70 75 74 20 77 61 73 20 61 20  the input was a 
14970 4a 6f 69 6e 2c 20 77 65 20 6e 65 65 64 20 74 6f  Join, we need to
14980 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6a 6f   create a new jo
14990 69 6e 20 73 79 6d 62 6f 6c 2c 0d 0a 20 20 20 20  in symbol,..    
149a0 2f 2f 2f 20 6f 74 68 65 72 77 69 73 65 2c 20 77  /// otherwise, w
149b0 65 20 63 72 65 61 74 65 20 61 20 6e 6f 72 6d 61  e create a norma
149c0 6c 20 73 79 6d 62 6f 6c 2e 0d 0a 20 20 20 20 2f  l symbol...    /
149d0 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 57 65 20 74  //..    /// We t
149e0 68 65 6e 20 63 61 6c 6c 20 41 64 64 46 72 6f 6d  hen call AddFrom
149f0 53 79 6d 62 6f 6c 20 74 6f 20 61 64 64 20 74 68  Symbol to add th
14a00 65 20 41 53 20 63 6c 61 75 73 65 2c 20 61 6e 64  e AS clause, and
14a10 20 75 70 64 61 74 65 20 74 68 65 20 73 79 6d 62   update the symb
14a20 6f 6c 20 74 61 62 6c 65 2e 0d 0a 20 20 20 20 2f  ol table...    /
14a30 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20  //..    ///..   
14a40 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 49 66   ///..    /// If
14a50 20 74 68 65 20 63 68 69 6c 64 27 73 20 72 65 73   the child's res
14a60 75 6c 74 20 77 61 73 20 74 68 65 20 73 61 6d 65  ult was the same
14a70 20 61 73 20 74 68 65 20 70 61 72 65 6e 74 27 73   as the parent's
14a80 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63 6c 65  , we have to cle
14a90 61 6e 20 75 70 0d 0a 20 20 20 20 2f 2f 2f 20 74  an up..    /// t
14aa0 68 65 20 6c 69 73 74 20 6f 66 20 73 79 6d 62 6f  he list of symbo
14ab0 6c 73 20 69 6e 20 74 68 65 20 46 72 6f 6d 45 78  ls in the FromEx
14ac0 74 65 6e 74 73 20 6c 69 73 74 2c 20 73 69 6e 63  tents list, sinc
14ad0 65 20 74 68 69 73 20 63 6f 6e 74 61 69 6e 73 20  e this contains 
14ae0 73 79 6d 62 6f 6c 73 20 66 72 6f 6d 0d 0a 20 20  symbols from..  
14af0 20 20 2f 2f 2f 20 74 68 65 20 63 68 69 6c 64 72    /// the childr
14b00 65 6e 20 6f 66 20 62 6f 74 68 20 74 68 65 20 70  en of both the p
14b10 61 72 65 6e 74 20 61 6e 64 20 74 68 65 20 63 68  arent and the ch
14b20 69 6c 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  ild...    /// Th
14b30 65 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  e happens when t
14b40 68 65 20 63 68 69 6c 64 20 76 69 73 69 74 65 64  he child visited
14b50 20 69 73 20 61 20 4a 6f 69 6e 2c 20 61 6e 64 20   is a Join, and 
14b60 69 73 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20  is the leftmost 
14b70 63 68 69 6c 64 20 6f 66 0d 0a 20 20 20 20 2f 2f  child of..    //
14b80 2f 20 74 68 65 20 70 61 72 65 6e 74 2e 0d 0a 20  / the parent... 
14b90 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
14ba0 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
14bb0 6d 20 6e 61 6d 65 3d 22 66 72 6f 6d 45 78 74 65  m name="fromExte
14bc0 6e 74 46 72 61 67 6d 65 6e 74 22 3e 3c 2f 70 61  ntFragment"></pa
14bd0 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
14be0 61 72 61 6d 20 6e 61 6d 65 3d 22 72 65 73 75 6c  aram name="resul
14bf0 74 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  t"></param>..   
14c00 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
14c10 3d 22 69 6e 70 75 74 22 3e 3c 2f 70 61 72 61 6d  ="input"></param
14c20 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
14c30 6d 20 6e 61 6d 65 3d 22 66 72 6f 6d 53 79 6d 62  m name="fromSymb
14c40 6f 6c 53 74 61 72 74 22 3e 3c 2f 70 61 72 61 6d  olStart"></param
14c50 3e 0d 0a 20 20 20 20 76 6f 69 64 20 50 72 6f 63  >..    void Proc
14c60 65 73 73 4a 6f 69 6e 49 6e 70 75 74 52 65 73 75  essJoinInputResu
14c70 6c 74 28 49 53 71 6c 46 72 61 67 6d 65 6e 74 20  lt(ISqlFragment 
14c80 66 72 6f 6d 45 78 74 65 6e 74 46 72 61 67 6d 65  fromExtentFragme
14c90 6e 74 2c 20 53 71 6c 53 65 6c 65 63 74 53 74 61  nt, SqlSelectSta
14ca0 74 65 6d 65 6e 74 20 72 65 73 75 6c 74 2c 0d 0a  tement result,..
14cb0 20 20 20 20 20 20 20 20 44 62 45 78 70 72 65 73          DbExpres
14cc0 73 69 6f 6e 42 69 6e 64 69 6e 67 20 69 6e 70 75  sionBinding inpu
14cd0 74 2c 20 69 6e 74 20 66 72 6f 6d 53 79 6d 62 6f  t, int fromSymbo
14ce0 6c 53 74 61 72 74 29 0d 0a 20 20 20 20 7b 0d 0a  lStart)..    {..
14cf0 20 20 20 20 20 20 53 79 6d 62 6f 6c 20 66 72 6f        Symbol fro
14d00 6d 53 79 6d 62 6f 6c 20 3d 20 6e 75 6c 6c 3b 0d  mSymbol = null;.
14d10 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 72 65 73  ...      if (res
14d20 75 6c 74 20 21 3d 20 66 72 6f 6d 45 78 74 65 6e  ult != fromExten
14d30 74 46 72 61 67 6d 65 6e 74 29 0d 0a 20 20 20 20  tFragment)..    
14d40 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20    {..        // 
14d50 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 69 74  The child has it
14d60 73 20 6f 77 6e 20 73 65 6c 65 63 74 20 73 74 61  s own select sta
14d70 74 65 6d 65 6e 74 2c 20 61 6e 64 20 69 73 20 6e  tement, and is n
14d80 6f 74 20 72 65 75 73 69 6e 67 0d 0a 20 20 20 20  ot reusing..    
14d90 20 20 20 20 2f 2f 20 6f 75 72 20 73 65 6c 65 63      // our selec
14da0 74 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20  t statement...  
14db0 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20 73 68        // This sh
14dc0 6f 75 6c 64 20 6c 6f 6f 6b 20 61 20 6c 6f 74 20  ould look a lot 
14dd0 6c 69 6b 65 20 56 69 73 69 74 49 6e 70 75 74 45  like VisitInputE
14de0 78 70 72 65 73 73 69 6f 6e 28 29 2e 0d 0a 20 20  xpression()...  
14df0 20 20 20 20 20 20 53 71 6c 53 65 6c 65 63 74 53        SqlSelectS
14e00 74 61 74 65 6d 65 6e 74 20 73 71 6c 53 65 6c 65  tatement sqlSele
14e10 63 74 53 74 61 74 65 6d 65 6e 74 20 3d 20 66 72  ctStatement = fr
14e20 6f 6d 45 78 74 65 6e 74 46 72 61 67 6d 65 6e 74  omExtentFragment
14e30 20 61 73 20 53 71 6c 53 65 6c 65 63 74 53 74 61   as SqlSelectSta
14e40 74 65 6d 65 6e 74 3b 0d 0a 20 20 20 20 20 20 20  tement;..       
14e50 20 69 66 20 28 73 71 6c 53 65 6c 65 63 74 53 74   if (sqlSelectSt
14e60 61 74 65 6d 65 6e 74 20 21 3d 20 6e 75 6c 6c 29  atement != null)
14e70 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
14e80 20 20 20 20 20 20 20 69 66 20 28 73 71 6c 53 65         if (sqlSe
14e90 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 2e 53 65  lectStatement.Se
14ea0 6c 65 63 74 2e 49 73 45 6d 70 74 79 29 0d 0a 20  lect.IsEmpty).. 
14eb0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
14ec0 20 20 20 20 20 20 20 20 4c 69 73 74 3c 53 79 6d          List<Sym
14ed0 62 6f 6c 3e 20 63 6f 6c 75 6d 6e 73 20 3d 20 41  bol> columns = A
14ee0 64 64 44 65 66 61 75 6c 74 43 6f 6c 75 6d 6e 73  ddDefaultColumns
14ef0 28 73 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d  (sqlSelectStatem
14f00 65 6e 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ent);....       
14f10 20 20 20 20 20 69 66 20 28 49 73 4a 6f 69 6e 45       if (IsJoinE
14f20 78 70 72 65 73 73 69 6f 6e 28 69 6e 70 75 74 2e  xpression(input.
14f30 45 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20  Expression)..   
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
14f50 49 73 41 70 70 6c 79 45 78 70 72 65 73 73 69 6f  IsApplyExpressio
14f60 6e 28 69 6e 70 75 74 2e 45 78 70 72 65 73 73 69  n(input.Expressi
14f70 6f 6e 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  on))..          
14f80 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
14f90 20 20 20 4c 69 73 74 3c 53 79 6d 62 6f 6c 3e 20     List<Symbol> 
14fa0 65 78 74 65 6e 74 73 20 3d 20 73 71 6c 53 65 6c  extents = sqlSel
14fb0 65 63 74 53 74 61 74 65 6d 65 6e 74 2e 46 72 6f  ectStatement.Fro
14fc0 6d 45 78 74 65 6e 74 73 3b 0d 0a 20 20 20 20 20  mExtents;..     
14fd0 20 20 20 20 20 20 20 20 20 4a 6f 69 6e 53 79 6d           JoinSym
14fe0 62 6f 6c 20 6e 65 77 4a 6f 69 6e 53 79 6d 62 6f  bol newJoinSymbo
14ff0 6c 20 3d 20 6e 65 77 20 4a 6f 69 6e 53 79 6d 62  l = new JoinSymb
15000 6f 6c 28 69 6e 70 75 74 2e 56 61 72 69 61 62 6c  ol(input.Variabl
15010 65 4e 61 6d 65 2c 20 69 6e 70 75 74 2e 56 61 72  eName, input.Var
15020 69 61 62 6c 65 54 79 70 65 2c 20 65 78 74 65 6e  iableType, exten
15030 74 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ts);..          
15040 20 20 20 20 6e 65 77 4a 6f 69 6e 53 79 6d 62 6f      newJoinSymbo
15050 6c 2e 49 73 4e 65 73 74 65 64 4a 6f 69 6e 20 3d  l.IsNestedJoin =
15060 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
15070 20 20 20 20 20 20 6e 65 77 4a 6f 69 6e 53 79 6d        newJoinSym
15080 62 6f 6c 2e 43 6f 6c 75 6d 6e 4c 69 73 74 20 3d  bol.ColumnList =
15090 20 63 6f 6c 75 6d 6e 73 3b 0d 0a 0d 0a 20 20 20   columns;....   
150a0 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 53             fromS
150b0 79 6d 62 6f 6c 20 3d 20 6e 65 77 4a 6f 69 6e 53  ymbol = newJoinS
150c0 79 6d 62 6f 6c 3b 0d 0a 20 20 20 20 20 20 20 20  ymbol;..        
150d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
150e0 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
150f0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
15100 20 20 20 20 20 20 2f 2f 20 74 68 69 73 20 69 73        // this is
15110 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
15120 6f 64 65 20 69 6e 20 43 72 65 61 74 65 4e 65 77  ode in CreateNew
15130 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 2e  SelectStatement.
15140 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15150 20 20 2f 2f 20 69 66 20 74 68 65 20 6f 6c 64 53    // if the oldS
15160 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 20 6a  tatement has a j
15170 6f 69 6e 20 61 73 20 69 74 73 20 69 6e 70 75 74  oin as its input
15180 2c 20 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20  , .....         
15190 20 20 20 20 20 2f 2f 20 63 6c 6f 6e 65 20 74 68       // clone th
151a0 65 20 6a 6f 69 6e 20 73 79 6d 62 6f 6c 2c 20 73  e join symbol, s
151b0 6f 20 74 68 61 74 20 77 65 20 22 72 65 75 73 65  o that we "reuse
151c0 22 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  " the..         
151d0 20 20 20 20 20 2f 2f 20 6a 6f 69 6e 20 73 79 6d       // join sym
151e0 62 6f 6c 2e 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20  bol.  Normally, 
151f0 77 65 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  we create a new 
15200 73 79 6d 62 6f 6c 20 2d 20 73 65 65 20 74 68 65  symbol - see the
15210 20 6e 65 78 74 20 62 6c 6f 63 6b 0d 0a 20 20 20   next block..   
15220 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6f 66             // of
15230 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   code...        
15240 20 20 20 20 20 20 4a 6f 69 6e 53 79 6d 62 6f 6c        JoinSymbol
15250 20 6f 6c 64 4a 6f 69 6e 53 79 6d 62 6f 6c 20 3d   oldJoinSymbol =
15260 20 73 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d   sqlSelectStatem
15270 65 6e 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73 5b  ent.FromExtents[
15280 30 5d 20 61 73 20 4a 6f 69 6e 53 79 6d 62 6f 6c  0] as JoinSymbol
15290 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
152a0 20 69 66 20 28 6f 6c 64 4a 6f 69 6e 53 79 6d 62   if (oldJoinSymb
152b0 6f 6c 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ol != null)..   
152c0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
152e0 20 4e 6f 74 65 3a 20 73 71 6c 53 65 6c 65 63 74   Note: sqlSelect
152f0 53 74 61 74 65 6d 65 6e 74 2e 46 72 6f 6d 45 78  Statement.FromEx
15300 74 65 6e 74 73 20 77 69 6c 6c 20 6e 6f 74 20 64  tents will not d
15310 6f 2c 20 73 69 6e 63 65 20 69 74 20 6d 69 67 68  o, since it migh
15320 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
15330 20 20 20 2f 2f 20 6a 75 73 74 20 62 65 20 61 6e     // just be an
15340 20 61 6c 69 61 73 20 6f 66 20 6a 6f 69 6e 53 79   alias of joinSy
15350 6d 62 6f 6c 2c 20 61 6e 64 20 77 65 20 77 61 6e  mbol, and we wan
15360 74 20 61 6e 20 61 63 74 75 61 6c 20 4a 6f 69 6e  t an actual Join
15370 53 79 6d 62 6f 6c 2e 0d 0a 20 20 20 20 20 20 20  Symbol...       
15380 20 20 20 20 20 20 20 20 20 4a 6f 69 6e 53 79 6d           JoinSym
15390 62 6f 6c 20 6e 65 77 4a 6f 69 6e 53 79 6d 62 6f  bol newJoinSymbo
153a0 6c 20 3d 20 6e 65 77 20 4a 6f 69 6e 53 79 6d 62  l = new JoinSymb
153b0 6f 6c 28 69 6e 70 75 74 2e 56 61 72 69 61 62 6c  ol(input.Variabl
153c0 65 4e 61 6d 65 2c 20 69 6e 70 75 74 2e 56 61 72  eName, input.Var
153d0 69 61 62 6c 65 54 79 70 65 2c 20 6f 6c 64 4a 6f  iableType, oldJo
153e0 69 6e 53 79 6d 62 6f 6c 2e 45 78 74 65 6e 74 4c  inSymbol.ExtentL
153f0 69 73 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ist);..         
15400 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20 69         // This i
15410 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
15420 65 20 73 71 6c 53 65 6c 65 63 74 53 74 61 74 65  e sqlSelectState
15430 6d 65 6e 74 20 69 73 20 61 20 62 6c 6f 63 6b 69  ment is a blocki
15440 6e 67 20 73 63 6f 70 65 0d 0a 20 20 20 20 20 20  ng scope..      
15450 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 2e 65            // i.e
15460 2e 20 69 74 20 68 69 64 65 73 2f 72 65 6e 61 6d  . it hides/renam
15470 65 73 20 65 78 74 65 6e 74 20 63 6f 6c 75 6d 6e  es extent column
15480 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
15490 20 20 20 6e 65 77 4a 6f 69 6e 53 79 6d 62 6f 6c     newJoinSymbol
154a0 2e 49 73 4e 65 73 74 65 64 4a 6f 69 6e 20 3d 20  .IsNestedJoin = 
154b0 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  true;..         
154c0 20 20 20 20 20 20 20 6e 65 77 4a 6f 69 6e 53 79         newJoinSy
154d0 6d 62 6f 6c 2e 43 6f 6c 75 6d 6e 4c 69 73 74 20  mbol.ColumnList 
154e0 3d 20 63 6f 6c 75 6d 6e 73 3b 0d 0a 20 20 20 20  = columns;..    
154f0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 4a              newJ
15500 6f 69 6e 53 79 6d 62 6f 6c 2e 46 6c 61 74 74 65  oinSymbol.Flatte
15510 6e 65 64 45 78 74 65 6e 74 4c 69 73 74 20 3d 20  nedExtentList = 
15520 6f 6c 64 4a 6f 69 6e 53 79 6d 62 6f 6c 2e 46 6c  oldJoinSymbol.Fl
15530 61 74 74 65 6e 65 64 45 78 74 65 6e 74 4c 69 73  attenedExtentLis
15540 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  t;....          
15550 20 20 20 20 20 20 66 72 6f 6d 53 79 6d 62 6f 6c        fromSymbol
15560 20 3d 20 6e 65 77 4a 6f 69 6e 53 79 6d 62 6f 6c   = newJoinSymbol
15570 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
15580 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
15590 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  }....          }
155a0 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75  ..          resu
155b0 6c 74 2e 46 72 6f 6d 2e 41 70 70 65 6e 64 28 22  lt.From.Append("
155c0 20 28 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20   (");..         
155d0 20 72 65 73 75 6c 74 2e 46 72 6f 6d 2e 41 70 70   result.From.App
155e0 65 6e 64 28 73 71 6c 53 65 6c 65 63 74 53 74 61  end(sqlSelectSta
155f0 74 65 6d 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20  tement);..      
15600 20 20 20 20 72 65 73 75 6c 74 2e 46 72 6f 6d 2e      result.From.
15610 41 70 70 65 6e 64 28 22 20 29 22 29 3b 0d 0a 20  Append(" )");.. 
15620 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15630 20 20 65 6c 73 65 20 69 66 20 28 69 6e 70 75 74    else if (input
15640 2e 45 78 70 72 65 73 73 69 6f 6e 20 69 73 20 44  .Expression is D
15650 62 53 63 61 6e 45 78 70 72 65 73 73 69 6f 6e 29  bScanExpression)
15660 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
15670 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 46 72         result.Fr
15680 6f 6d 2e 41 70 70 65 6e 64 28 66 72 6f 6d 45 78  om.Append(fromEx
15690 74 65 6e 74 46 72 61 67 6d 65 6e 74 29 3b 0d 0a  tentFragment);..
156a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
156b0 20 20 20 65 6c 73 65 20 2f 2f 20 62 72 61 63 6b     else // brack
156c0 65 74 20 69 74 0d 0a 20 20 20 20 20 20 20 20 7b  et it..        {
156d0 0d 0a 20 20 20 20 20 20 20 20 20 20 57 72 61 70  ..          Wrap
156e0 4e 6f 6e 51 75 65 72 79 45 78 74 65 6e 74 28 72  NonQueryExtent(r
156f0 65 73 75 6c 74 2c 20 66 72 6f 6d 45 78 74 65 6e  esult, fromExten
15700 74 46 72 61 67 6d 65 6e 74 2c 20 69 6e 70 75 74  tFragment, input
15710 2e 45 78 70 72 65 73 73 69 6f 6e 2e 45 78 70 72  .Expression.Expr
15720 65 73 73 69 6f 6e 4b 69 6e 64 29 3b 0d 0a 20 20  essionKind);..  
15730 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15740 20 20 20 69 66 20 28 66 72 6f 6d 53 79 6d 62 6f     if (fromSymbo
15750 6c 20 3d 3d 20 6e 75 6c 6c 29 20 2f 2f 20 69 2e  l == null) // i.
15760 65 2e 20 6e 6f 74 20 61 20 6a 6f 69 6e 20 73 79  e. not a join sy
15770 6d 62 6f 6c 0d 0a 20 20 20 20 20 20 20 20 7b 0d  mbol..        {.
15780 0a 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 53  .          fromS
15790 79 6d 62 6f 6c 20 3d 20 6e 65 77 20 53 79 6d 62  ymbol = new Symb
157a0 6f 6c 28 69 6e 70 75 74 2e 56 61 72 69 61 62 6c  ol(input.Variabl
157b0 65 4e 61 6d 65 2c 20 69 6e 70 75 74 2e 56 61 72  eName, input.Var
157c0 69 61 62 6c 65 54 79 70 65 29 3b 0d 0a 20 20 20  iableType);..   
157d0 20 20 20 20 20 7d 0d 0a 0d 0a 0d 0a 20 20 20 20       }......    
157e0 20 20 20 20 41 64 64 46 72 6f 6d 53 79 6d 62 6f      AddFromSymbo
157f0 6c 28 72 65 73 75 6c 74 2c 20 69 6e 70 75 74 2e  l(result, input.
15800 56 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20 66 72  VariableName, fr
15810 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20  omSymbol);..    
15820 20 20 20 20 72 65 73 75 6c 74 2e 41 6c 6c 4a 6f      result.AllJo
15830 69 6e 45 78 74 65 6e 74 73 2e 41 64 64 28 66 72  inExtents.Add(fr
15840 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20  omSymbol);..    
15850 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65 20    }..      else 
15860 2f 2f 20 72 65 73 75 6c 74 20 3d 3d 20 66 72 6f  // result == fro
15870 6d 45 78 74 65 6e 74 46 72 61 67 6d 65 6e 74 2e  mExtentFragment.
15880 20 20 54 68 65 20 63 68 69 6c 64 20 65 78 74 65    The child exte
15890 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20 6d 65  nts have been me
158a0 72 67 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61  rged into the pa
158b0 72 65 6e 74 27 73 2e 0d 0a 20 20 20 20 20 20 7b  rent's...      {
158c0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 77 65 20  ..        // we 
158d0 61 72 65 20 61 64 64 69 6e 67 20 65 78 74 65 6e  are adding exten
158e0 74 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ts to the curren
158f0 74 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  t sql statement 
15900 76 69 61 20 66 6c 61 74 74 65 6e 69 6e 67 2e 0d  via flattening..
15910 0a 20 20 20 20 20 20 20 20 2f 2f 20 57 65 20 61  .        // We a
15920 72 65 20 72 65 70 6c 61 63 69 6e 67 20 74 68 65  re replacing the
15930 20 63 68 69 6c 64 27 73 20 65 78 74 65 6e 74 73   child's extents
15940 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 4a   with a single J
15950 6f 69 6e 20 73 79 6d 62 6f 6c 2e 0d 0a 20 20 20  oin symbol...   
15960 20 20 20 20 20 2f 2f 20 54 68 65 20 63 68 69 6c       // The chil
15970 64 27 73 20 65 78 74 65 6e 74 73 20 61 72 65 20  d's extents are 
15980 61 6c 6c 20 74 68 6f 73 65 20 66 6f 6c 6c 6f 77  all those follow
15990 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 66 72  ing the index fr
159a0 6f 6d 53 79 6d 62 6f 6c 53 74 61 72 74 2e 0d 0a  omSymbolStart...
159b0 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
159c0 20 20 20 20 4c 69 73 74 3c 53 79 6d 62 6f 6c 3e      List<Symbol>
159d0 20 65 78 74 65 6e 74 73 20 3d 20 6e 65 77 20 4c   extents = new L
159e0 69 73 74 3c 53 79 6d 62 6f 6c 3e 28 29 3b 0d 0a  ist<Symbol>();..
159f0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 57 65 20  ..        // We 
15a00 63 61 6e 6e 6f 74 20 63 61 6c 6c 20 65 78 74 65  cannot call exte
15a10 6e 74 73 2e 41 64 64 52 61 6e 67 65 2c 20 73 69  nts.AddRange, si
15a20 6e 63 65 20 74 68 65 20 69 73 20 6e 6f 20 73 69  nce the is no si
15a30 6d 70 6c 65 20 77 61 79 20 74 6f 0d 0a 20 20 20  mple way to..   
15a40 20 20 20 20 20 2f 2f 20 67 65 74 20 74 68 65 20       // get the 
15a50 72 61 6e 67 65 20 6f 66 20 73 79 6d 62 6f 6c 73  range of symbols
15a60 20 66 72 6f 6d 53 79 6d 62 6f 6c 53 74 61 72 74   fromSymbolStart
15a70 2e 2e 72 65 73 75 6c 74 2e 46 72 6f 6d 45 78 74  ..result.FromExt
15a80 65 6e 74 73 2e 43 6f 75 6e 74 0d 0a 20 20 20 20  ents.Count..    
15a90 20 20 20 20 2f 2f 20 66 72 6f 6d 20 72 65 73 75      // from resu
15aa0 6c 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73 2e 0d  lt.FromExtents..
15ab0 0a 20 20 20 20 20 20 20 20 2f 2f 20 57 65 20 63  .        // We c
15ac0 6f 70 79 20 74 68 65 73 65 20 73 79 6d 62 6f 6c  opy these symbol
15ad0 73 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  s to create the 
15ae0 4a 6f 69 6e 53 79 6d 62 6f 6c 20 6c 61 74 65 72  JoinSymbol later
15af0 2e 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28  ...        for (
15b00 69 6e 74 20 69 20 3d 20 66 72 6f 6d 53 79 6d 62  int i = fromSymb
15b10 6f 6c 53 74 61 72 74 3b 20 69 20 3c 20 72 65 73  olStart; i < res
15b20 75 6c 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73 2e  ult.FromExtents.
15b30 43 6f 75 6e 74 3b 20 2b 2b 69 29 0d 0a 20 20 20  Count; ++i)..   
15b40 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
15b50 20 20 65 78 74 65 6e 74 73 2e 41 64 64 28 72 65    extents.Add(re
15b60 73 75 6c 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73  sult.FromExtents
15b70 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  [i]);..        }
15b80 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  ..        result
15b90 2e 46 72 6f 6d 45 78 74 65 6e 74 73 2e 52 65 6d  .FromExtents.Rem
15ba0 6f 76 65 52 61 6e 67 65 28 66 72 6f 6d 53 79 6d  oveRange(fromSym
15bb0 62 6f 6c 53 74 61 72 74 2c 20 72 65 73 75 6c 74  bolStart, result
15bc0 2e 46 72 6f 6d 45 78 74 65 6e 74 73 2e 43 6f 75  .FromExtents.Cou
15bd0 6e 74 20 2d 20 66 72 6f 6d 53 79 6d 62 6f 6c 53  nt - fromSymbolS
15be0 74 61 72 74 29 3b 0d 0a 20 20 20 20 20 20 20 20  tart);..        
15bf0 66 72 6f 6d 53 79 6d 62 6f 6c 20 3d 20 6e 65 77  fromSymbol = new
15c00 20 4a 6f 69 6e 53 79 6d 62 6f 6c 28 69 6e 70 75   JoinSymbol(inpu
15c10 74 2e 56 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20  t.VariableName, 
15c20 69 6e 70 75 74 2e 56 61 72 69 61 62 6c 65 54 79  input.VariableTy
15c30 70 65 2c 20 65 78 74 65 6e 74 73 29 3b 0d 0a 20  pe, extents);.. 
15c40 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 46 72         result.Fr
15c50 6f 6d 45 78 74 65 6e 74 73 2e 41 64 64 28 66 72  omExtents.Add(fr
15c60 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20  omSymbol);..    
15c70 20 20 20 20 2f 2f 20 74 68 69 73 20 4a 6f 69 6e      // this Join
15c80 20 53 79 6d 62 6f 6c 20 64 6f 65 73 20 6e 6f 74   Symbol does not
15c90 20 68 61 76 65 20 69 74 73 20 6f 77 6e 20 73 65   have its own se
15ca0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2c 20  lect statement, 
15cb0 73 6f 20 77 65 0d 0a 20 20 20 20 20 20 20 20 2f  so we..        /
15cc0 2f 20 64 6f 20 6e 6f 74 20 73 65 74 20 49 73 4e  / do not set IsN
15cd0 65 73 74 65 64 4a 6f 69 6e 0d 0a 0d 0a 0d 0a 20  estedJoin...... 
15ce0 20 20 20 20 20 20 20 2f 2f 20 57 65 20 64 6f 20         // We do 
15cf0 6e 6f 74 20 63 61 6c 6c 20 41 64 64 46 72 6f 6d  not call AddFrom
15d00 53 79 6d 62 6f 6c 28 29 2c 20 73 69 6e 63 65 20  Symbol(), since 
15d10 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
15d20 6f 20 61 64 64 0d 0a 20 20 20 20 20 20 20 20 2f  o add..        /
15d30 2f 20 22 41 53 20 61 6c 69 61 73 22 20 74 6f 20  / "AS alias" to 
15d40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2d  the FROM clause-
15d50 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 6f 6e   it has been don
15d60 65 20 77 68 65 6e 20 74 68 65 20 65 78 74 65 6e  e when the exten
15d70 74 20 77 61 73 20 61 64 64 65 64 20 65 61 72 6c  t was added earl
15d80 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 73 79  ier...        sy
15d90 6d 62 6f 6c 54 61 62 6c 65 2e 41 64 64 28 69 6e  mbolTable.Add(in
15da0 70 75 74 2e 56 61 72 69 61 62 6c 65 4e 61 6d 65  put.VariableName
15db0 2c 20 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a  , fromSymbol);..
15dc0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
15dd0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
15de0 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 57 65 20  ry>..    /// We 
15df0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 69 73  assume that this
15e00 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
15e10 61 73 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  as a child of a 
15e20 50 72 6f 6a 65 63 74 2e 0d 0a 20 20 20 20 2f 2f  Project...    //
15e30 2f 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20  /..    /// This 
15e40 72 65 70 6c 61 63 65 73 20 3c 73 65 65 20 63 72  replaces <see cr
15e50 65 66 3d 22 56 69 73 69 74 28 44 62 4e 65 77 49  ef="Visit(DbNewI
15e60 6e 73 74 61 6e 63 65 45 78 70 72 65 73 73 69 6f  nstanceExpressio
15e70 6e 29 22 2f 3e 2c 20 73 69 6e 63 65 0d 0a 20 20  n)"/>, since..  
15e80 20 20 2f 2f 2f 20 77 65 20 64 6f 20 6e 6f 74 20    /// we do not 
15e90 61 6c 6c 6f 77 20 44 62 4e 65 77 49 6e 73 74 61  allow DbNewInsta
15ea0 6e 63 65 45 78 70 72 65 73 73 69 6f 6e 20 61 73  nceExpression as
15eb0 20 61 20 63 68 69 6c 64 20 6f 66 20 61 6e 79 20   a child of any 
15ec0 6e 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 0d  node other than.
15ed0 0a 20 20 20 20 2f 2f 2f 20 44 62 50 72 6f 6a 65  .    /// DbProje
15ee0 63 74 45 78 70 72 65 73 73 69 6f 6e 2e 0d 0a 20  ctExpression... 
15ef0 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20     ///..    /// 
15f00 57 65 20 77 72 69 74 65 20 6f 75 74 20 74 68 65  We write out the
15f10 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 66 20   translation of 
15f20 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6c 75  each of the colu
15f30 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  mns in the recor
15f40 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  d...    /// </su
15f50 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
15f60 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e  <param name="e">
15f70 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
15f80 2f 20 3c 72 65 74 75 72 6e 73 3e 41 20 3c 73 65  / <returns>A <se
15f90 65 20 63 72 65 66 3d 22 53 71 6c 42 75 69 6c 64  e cref="SqlBuild
15fa0 65 72 22 2f 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d  er"/></returns>.
15fb0 0a 20 20 20 20 49 53 71 6c 46 72 61 67 6d 65 6e  .    ISqlFragmen
15fc0 74 20 56 69 73 69 74 4e 65 77 49 6e 73 74 61 6e  t VisitNewInstan
15fd0 63 65 45 78 70 72 65 73 73 69 6f 6e 28 44 62 4e  ceExpression(DbN
15fe0 65 77 49 6e 73 74 61 6e 63 65 45 78 70 72 65 73  ewInstanceExpres
15ff0 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a  sion e)..    {..
16000 20 20 20 20 20 20 53 71 6c 42 75 69 6c 64 65 72        SqlBuilder
16010 20 72 65 73 75 6c 74 20 3d 20 6e 65 77 20 53 71   result = new Sq
16020 6c 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20  lBuilder();..   
16030 20 20 20 52 6f 77 54 79 70 65 20 72 6f 77 54 79     RowType rowTy
16040 70 65 20 3d 20 65 2e 52 65 73 75 6c 74 54 79 70  pe = e.ResultTyp
16050 65 2e 45 64 6d 54 79 70 65 20 61 73 20 52 6f 77  e.EdmType as Row
16060 54 79 70 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 69  Type;....      i
16070 66 20 28 6e 75 6c 6c 20 21 3d 20 72 6f 77 54 79  f (null != rowTy
16080 70 65 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  pe)..      {..  
16090 20 20 20 20 20 20 2f 2f 5f 74 79 70 65 44 65 66        //_typeDef
160a0 73 2e 4c 65 6e 67 74 68 20 3d 20 30 3b 0d 0a 20  s.Length = 0;.. 
160b0 20 20 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 4d         ReadOnlyM
160c0 65 74 61 64 61 74 61 43 6f 6c 6c 65 63 74 69 6f  etadataCollectio
160d0 6e 3c 45 64 6d 50 72 6f 70 65 72 74 79 3e 20 6d  n<EdmProperty> m
160e0 65 6d 62 65 72 73 20 3d 20 72 6f 77 54 79 70 65  embers = rowType
160f0 2e 50 72 6f 70 65 72 74 69 65 73 3b 0d 0a 20 20  .Properties;..  
16100 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 65 70        string sep
16110 61 72 61 74 6f 72 20 3d 20 53 74 72 69 6e 67 2e  arator = String.
16120 45 6d 70 74 79 3b 0d 0a 20 20 20 20 20 20 20 20  Empty;..        
16130 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
16140 69 20 3c 20 65 2e 41 72 67 75 6d 65 6e 74 73 2e  i < e.Arguments.
16150 43 6f 75 6e 74 3b 20 2b 2b 69 29 0d 0a 20 20 20  Count; ++i)..   
16160 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
16170 20 20 44 62 45 78 70 72 65 73 73 69 6f 6e 20 61    DbExpression a
16180 72 67 75 6d 65 6e 74 20 3d 20 65 2e 41 72 67 75  rgument = e.Argu
16190 6d 65 6e 74 73 5b 69 5d 3b 0d 0a 20 20 20 20 20  ments[i];..     
161a0 20 20 20 20 20 69 66 20 28 4d 65 74 61 64 61 74       if (Metadat
161b0 61 48 65 6c 70 65 72 73 2e 49 73 52 6f 77 54 79  aHelpers.IsRowTy
161c0 70 65 28 61 72 67 75 6d 65 6e 74 2e 52 65 73 75  pe(argument.Resu
161d0 6c 74 54 79 70 65 29 29 0d 0a 20 20 20 20 20 20  ltType))..      
161e0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
161f0 20 20 20 2f 2f 20 57 65 20 64 6f 20 6e 6f 74 20     // We do not 
16200 73 75 70 70 6f 72 74 20 6e 65 73 74 65 64 20 72  support nested r
16210 65 63 6f 72 64 73 20 6f 72 20 6f 74 68 65 72 20  ecords or other 
16220 63 6f 6d 70 6c 65 78 20 6f 62 6a 65 63 74 73 2e  complex objects.
16230 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  ..            th
16240 72 6f 77 20 6e 65 77 20 4e 6f 74 53 75 70 70 6f  row new NotSuppo
16250 72 74 65 64 45 78 63 65 70 74 69 6f 6e 28 29 3b  rtedException();
16260 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
16270 0a 20 20 20 20 20 20 20 20 20 20 45 64 6d 50 72  .          EdmPr
16280 6f 70 65 72 74 79 20 6d 65 6d 62 65 72 20 3d 20  operty member = 
16290 6d 65 6d 62 65 72 73 5b 69 5d 3b 0d 0a 20 20 20  members[i];..   
162a0 20 20 20 20 20 20 20 2f 2f 5f 74 79 70 65 44 65         //_typeDe
162b0 66 73 2e 41 70 70 65 6e 64 28 73 65 70 61 72 61  fs.Append(separa
162c0 74 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  tor);..         
162d0 20 2f 2f 5f 74 79 70 65 44 65 66 73 2e 41 70 70   //_typeDefs.App
162e0 65 6e 64 28 47 65 74 53 71 6c 50 72 69 6d 69 74  end(GetSqlPrimit
162f0 69 76 65 54 79 70 65 28 6d 65 6d 62 65 72 2e 54  iveType(member.T
16300 79 70 65 55 73 61 67 65 29 29 3b 0d 0a 20 20 20  ypeUsage));..   
16310 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70         result.Ap
16320 70 65 6e 64 28 73 65 70 61 72 61 74 6f 72 29 3b  pend(separator);
16330 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75  ..          resu
16340 6c 74 2e 41 70 70 65 6e 64 4c 69 6e 65 28 29 3b  lt.AppendLine();
16350 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75  ..          resu
16360 6c 74 2e 41 70 70 65 6e 64 28 61 72 67 75 6d 65  lt.Append(argume
16370 6e 74 2e 41 63 63 65 70 74 28 74 68 69 73 29 29  nt.Accept(this))
16380 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ;..          res
16390 75 6c 74 2e 41 70 70 65 6e 64 28 22 20 41 53 20  ult.Append(" AS 
163a0 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  ");..          r
163b0 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 51 75 6f  esult.Append(Quo
163c0 74 65 49 64 65 6e 74 69 66 69 65 72 28 6d 65 6d  teIdentifier(mem
163d0 62 65 72 2e 4e 61 6d 65 29 29 3b 0d 0a 20 20 20  ber.Name));..   
163e0 20 20 20 20 20 20 20 73 65 70 61 72 61 74 6f 72         separator
163f0 20 3d 20 22 2c 20 22 3b 0d 0a 20 20 20 20 20 20   = ", ";..      
16400 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
16410 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
16420 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20  {..        //.. 
16430 20 20 20 20 20 20 20 2f 2f 20 54 79 70 65 73 20         // Types 
16440 6f 74 68 65 72 20 74 68 65 6e 20 52 6f 77 54 79  other then RowTy
16450 70 65 20 28 73 75 63 68 20 61 73 20 55 44 54 73  pe (such as UDTs
16460 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 29 20 61   for instance) a
16470 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  re not supported
16480 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20  ...        //.. 
16490 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
164a0 20 4e 6f 74 53 75 70 70 6f 72 74 65 64 45 78 63   NotSupportedExc
164b0 65 70 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 20  eption();..     
164c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
164d0 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20  rn result;..    
164e0 7d 0d 0a 0d 0a 20 20 20 20 49 53 71 6c 46 72 61  }....    ISqlFra
164f0 67 6d 65 6e 74 20 56 69 73 69 74 53 65 74 4f 70  gment VisitSetOp
16500 45 78 70 72 65 73 73 69 6f 6e 28 44 62 45 78 70  Expression(DbExp
16510 72 65 73 73 69 6f 6e 20 6c 65 66 74 2c 20 44 62  ression left, Db
16520 45 78 70 72 65 73 73 69 6f 6e 20 72 69 67 68 74  Expression right
16530 2c 20 73 74 72 69 6e 67 20 73 65 70 61 72 61 74  , string separat
16540 6f 72 29 0d 0a 20 20 20 20 7b 0d 0a 0d 0a 20 20  or)..    {....  
16550 20 20 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61      SqlSelectSta
16560 74 65 6d 65 6e 74 20 6c 65 66 74 53 65 6c 65 63  tement leftSelec
16570 74 53 74 61 74 65 6d 65 6e 74 20 3d 20 56 69 73  tStatement = Vis
16580 69 74 45 78 70 72 65 73 73 69 6f 6e 45 6e 73 75  itExpressionEnsu
16590 72 65 53 71 6c 53 74 61 74 65 6d 65 6e 74 28 6c  reSqlStatement(l
165a0 65 66 74 29 3b 0d 0a 20 20 20 20 20 20 62 6f 6f  eft);..      boo
165b0 6c 20 6c 65 66 74 4f 72 64 65 72 42 79 4c 69 6d  l leftOrderByLim
165c0 69 74 4f 72 4f 66 66 73 65 74 20 3d 20 6c 65 66  itOrOffset = lef
165d0 74 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74  tSelectStatement
165e0 2e 48 61 76 65 4f 72 64 65 72 42 79 4c 69 6d 69  .HaveOrderByLimi
165f0 74 4f 72 4f 66 66 73 65 74 28 29 3b 0d 0a 20 20  tOrOffset();..  
16600 20 20 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61      SqlSelectSta
16610 74 65 6d 65 6e 74 20 72 69 67 68 74 53 65 6c 65  tement rightSele
16620 63 74 53 74 61 74 65 6d 65 6e 74 20 3d 20 56 69  ctStatement = Vi
16630 73 69 74 45 78 70 72 65 73 73 69 6f 6e 45 6e 73  sitExpressionEns
16640 75 72 65 53 71 6c 53 74 61 74 65 6d 65 6e 74 28  ureSqlStatement(
16650 72 69 67 68 74 29 3b 0d 0a 20 20 20 20 20 20 62  right);..      b
16660 6f 6f 6c 20 72 69 67 68 74 4f 72 64 65 72 42 79  ool rightOrderBy
16670 4c 69 6d 69 74 4f 72 4f 66 66 73 65 74 20 3d 20  LimitOrOffset = 
16680 72 69 67 68 74 53 65 6c 65 63 74 53 74 61 74 65  rightSelectState
16690 6d 65 6e 74 2e 48 61 76 65 4f 72 64 65 72 42 79  ment.HaveOrderBy
166a0 4c 69 6d 69 74 4f 72 4f 66 66 73 65 74 28 29 3b  LimitOrOffset();
166b0 0d 0a 0d 0a 20 20 20 20 20 20 53 71 6c 42 75 69  ....      SqlBui
166c0 6c 64 65 72 20 73 65 74 53 74 61 74 65 6d 65 6e  lder setStatemen
166d0 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64  t = new SqlBuild
166e0 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 69  er();....      i
166f0 66 20 28 6c 65 66 74 4f 72 64 65 72 42 79 4c 69  f (leftOrderByLi
16700 6d 69 74 4f 72 4f 66 66 73 65 74 29 0d 0a 20 20  mitOrOffset)..  
16710 20 20 20 20 20 20 20 20 73 65 74 53 74 61 74 65          setState
16720 6d 65 6e 74 2e 41 70 70 65 6e 64 28 22 53 45 4c  ment.Append("SEL
16730 45 43 54 20 2a 20 46 52 4f 4d 20 28 22 29 3b 0d  ECT * FROM (");.
16740 0a 0d 0a 20 20 20 20 20 20 73 65 74 53 74 61 74  ...      setStat
16750 65 6d 65 6e 74 2e 41 70 70 65 6e 64 28 6c 65 66  ement.Append(lef
16760 74 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74  tSelectStatement
16770 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28  );....      if (
16780 6c 65 66 74 4f 72 64 65 72 42 79 4c 69 6d 69 74  leftOrderByLimit
16790 4f 72 4f 66 66 73 65 74 29 0d 0a 20 20 20 20 20  OrOffset)..     
167a0 20 20 20 20 20 73 65 74 53 74 61 74 65 6d 65 6e       setStatemen
167b0 74 2e 41 70 70 65 6e 64 28 22 29 20 22 29 3b 0d  t.Append(") ");.
167c0 0a 0d 0a 20 20 20 20 20 20 73 65 74 53 74 61 74  ...      setStat
167d0 65 6d 65 6e 74 2e 41 70 70 65 6e 64 4c 69 6e 65  ement.AppendLine
167e0 28 29 3b 0d 0a 20 20 20 20 20 20 73 65 74 53 74  ();..      setSt
167f0 61 74 65 6d 65 6e 74 2e 41 70 70 65 6e 64 28 73  atement.Append(s
16800 65 70 61 72 61 74 6f 72 29 3b 20 2f 2f 20 65 2e  eparator); // e.
16810 67 2e 20 55 4e 49 4f 4e 20 41 4c 4c 0d 0a 20 20  g. UNION ALL..  
16820 20 20 20 20 73 65 74 53 74 61 74 65 6d 65 6e 74      setStatement
16830 2e 41 70 70 65 6e 64 4c 69 6e 65 28 29 3b 0d 0a  .AppendLine();..
16840 0d 0a 20 20 20 20 20 20 69 66 20 28 72 69 67 68  ..      if (righ
16850 74 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 72 4f  tOrderByLimitOrO
16860 66 66 73 65 74 29 0d 0a 20 20 20 20 20 20 20 20  ffset)..        
16870 20 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2e 41    setStatement.A
16880 70 70 65 6e 64 28 22 53 45 4c 45 43 54 20 2a 20  ppend("SELECT * 
16890 46 52 4f 4d 20 28 22 29 3b 0d 0a 0d 0a 20 20 20  FROM (");....   
168a0 20 20 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2e     setStatement.
168b0 41 70 70 65 6e 64 28 72 69 67 68 74 53 65 6c 65  Append(rightSele
168c0 63 74 53 74 61 74 65 6d 65 6e 74 29 3b 0d 0a 0d  ctStatement);...
168d0 0a 20 20 20 20 20 20 69 66 20 28 72 69 67 68 74  .      if (right
168e0 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 72 4f 66  OrderByLimitOrOf
168f0 66 73 65 74 29 0d 0a 20 20 20 20 20 20 20 20 20  fset)..         
16900 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2e 41 70   setStatement.Ap
16910 70 65 6e 64 28 22 29 20 22 29 3b 0d 0a 0d 0a 20  pend(") ");.... 
16920 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 74 53       return setS
16930 74 61 74 65 6d 65 6e 74 3b 0d 0a 20 20 20 20 7d  tatement;..    }
16940 0d 0a 0d 0a 0d 0a 20 20 20 20 23 65 6e 64 72 65  ......    #endre
16950 67 69 6f 6e 0d 0a 0d 0a 0d 0a 20 20 20 20 23 72  gion......    #r
16960 65 67 69 6f 6e 20 46 75 6e 63 74 69 6f 6e 20 48  egion Function H
16970 61 6e 64 6c 69 6e 67 20 48 65 6c 70 65 72 73 0d  andling Helpers.
16980 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
16990 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 44 65 74 65  y>..    /// Dete
169a0 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 74  rmines whether t
169b0 68 65 20 67 69 76 65 6e 20 66 75 6e 63 74 69 6f  he given functio
169c0 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69 6e 20  n is a built-in 
169d0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65  function that re
169e0 71 75 69 72 65 73 20 73 70 65 63 69 61 6c 20 68  quires special h
169f0 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 2f 2f 2f  andling..    ///
16a00 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
16a10 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
16a20 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ="e"></param>.. 
16a30 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
16a40 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
16a50 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 49 73 53  private bool IsS
16a60 70 65 63 69 61 6c 42 75 69 6c 74 49 6e 46 75 6e  pecialBuiltInFun
16a70 63 74 69 6f 6e 28 44 62 46 75 6e 63 74 69 6f 6e  ction(DbFunction
16a80 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20  Expression e).. 
16a90 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75     {..      retu
16aa0 72 6e 20 49 73 42 75 69 6c 74 69 6e 46 75 6e 63  rn IsBuiltinFunc
16ab0 74 69 6f 6e 28 65 2e 46 75 6e 63 74 69 6f 6e 29  tion(e.Function)
16ac0 20 26 26 20 5f 62 75 69 6c 74 49 6e 46 75 6e 63   && _builtInFunc
16ad0 74 69 6f 6e 48 61 6e 64 6c 65 72 73 2e 43 6f 6e  tionHandlers.Con
16ae0 74 61 69 6e 73 4b 65 79 28 65 2e 46 75 6e 63 74  tainsKey(e.Funct
16af0 69 6f 6e 2e 4e 61 6d 65 29 3b 0d 0a 20 20 20 20  ion.Name);..    
16b00 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
16b10 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
16b20 44 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  Determines wheth
16b30 65 72 20 74 68 65 20 67 69 76 65 6e 20 66 75 6e  er the given fun
16b40 63 74 69 6f 6e 20 69 73 20 61 20 63 61 6e 6f 6e  ction is a canon
16b50 69 63 61 6c 20 66 75 6e 63 74 69 6f 6e 20 74 68  ical function th
16b60 61 74 20 72 65 71 75 69 72 65 73 20 73 70 65 63  at requires spec
16b70 69 61 6c 20 68 61 6e 64 6c 69 6e 67 0d 0a 20 20  ial handling..  
16b80 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
16b90 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
16ba0 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61   name="e"></para
16bb0 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
16bc0 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d  urns></returns>.
16bd0 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f  .    private boo
16be0 6c 20 49 73 53 70 65 63 69 61 6c 43 61 6e 6f 6e  l IsSpecialCanon
16bf0 69 63 61 6c 46 75 6e 63 74 69 6f 6e 28 44 62 46  icalFunction(DbF
16c00 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f  unctionExpressio
16c10 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n e)..    {..   
16c20 20 20 20 72 65 74 75 72 6e 20 4d 65 74 61 64 61     return Metada
16c30 74 61 48 65 6c 70 65 72 73 2e 49 73 43 61 6e 6f  taHelpers.IsCano
16c40 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 28 65 2e  nicalFunction(e.
16c50 46 75 6e 63 74 69 6f 6e 29 20 26 26 20 5f 63 61  Function) && _ca
16c60 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 48  nonicalFunctionH
16c70 61 6e 64 6c 65 72 73 2e 43 6f 6e 74 61 69 6e 73  andlers.Contains
16c80 4b 65 79 28 65 2e 46 75 6e 63 74 69 6f 6e 2e 4e  Key(e.Function.N
16c90 61 6d 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ame);..    }....
16ca0 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
16cb0 3e 0d 0a 20 20 20 20 2f 2f 2f 20 44 65 66 61 75  >..    /// Defau
16cc0 6c 74 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20  lt handling for 
16cd0 66 75 6e 63 74 69 6f 6e 73 0d 0a 20 20 20 20 2f  functions..    /
16ce0 2f 2f 20 54 72 61 6e 73 6c 61 74 65 73 20 74 68  // Translates th
16cf0 65 6d 20 74 6f 20 46 75 6e 63 74 69 6f 6e 4e 61  em to FunctionNa
16d00 6d 65 28 61 72 67 31 2c 20 61 72 67 32 2c 20 2e  me(arg1, arg2, .
16d10 2e 2e 2c 20 61 72 67 6e 29 0d 0a 20 20 20 20 2f  .., argn)..    /
16d20 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
16d30 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
16d40 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  me="e"></param>.
16d50 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
16d60 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  s></returns>..  
16d70 20 20 70 72 69 76 61 74 65 20 49 53 71 6c 46 72    private ISqlFr
16d80 61 67 6d 65 6e 74 20 48 61 6e 64 6c 65 46 75 6e  agment HandleFun
16d90 63 74 69 6f 6e 44 65 66 61 75 6c 74 28 44 62 46  ctionDefault(DbF
16da0 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f  unctionExpressio
16db0 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n e)..    {..   
16dc0 20 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72 65     SqlBuilder re
16dd0 73 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42 75  sult = new SqlBu
16de0 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20 20  ilder();..      
16df0 57 72 69 74 65 46 75 6e 63 74 69 6f 6e 4e 61 6d  WriteFunctionNam
16e00 65 28 72 65 73 75 6c 74 2c 20 65 2e 46 75 6e 63  e(result, e.Func
16e10 74 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 48 61  tion);..      Ha
16e20 6e 64 6c 65 46 75 6e 63 74 69 6f 6e 41 72 67 75  ndleFunctionArgu
16e30 6d 65 6e 74 73 44 65 66 61 75 6c 74 28 65 2c 20  mentsDefault(e, 
16e40 72 65 73 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20  result);..      
16e50 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a  return result;..
16e60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
16e70 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
16e80 2f 2f 2f 20 44 65 66 61 75 6c 74 20 68 61 6e 64  /// Default hand
16e90 6c 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  ling for functio
16ea0 6e 73 20 77 69 74 68 20 61 20 67 69 76 65 6e 20  ns with a given 
16eb0 6e 61 6d 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54  name...    /// T
16ec0 72 61 6e 73 6c 61 74 65 73 20 74 68 65 6d 20 74  ranslates them t
16ed0 6f 20 66 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 61  o functionName(a
16ee0 72 67 31 2c 20 61 72 67 32 2c 20 2e 2e 2e 2c 20  rg1, arg2, ..., 
16ef0 61 72 67 6e 29 0d 0a 20 20 20 20 2f 2f 2f 20 3c  argn)..    /// <
16f00 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
16f10 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
16f20 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  e"></param>..   
16f30 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
16f40 3d 22 66 75 6e 63 74 69 6f 6e 4e 61 6d 65 22 3e  ="functionName">
16f50 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
16f60 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74  / <returns></ret
16f70 75 72 6e 73 3e 0d 0a 20 20 20 20 70 72 69 76 61  urns>..    priva
16f80 74 65 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20  te ISqlFragment 
16f90 48 61 6e 64 6c 65 46 75 6e 63 74 69 6f 6e 44 65  HandleFunctionDe
16fa0 66 61 75 6c 74 47 69 76 65 6e 4e 61 6d 65 28 44  faultGivenName(D
16fb0 62 46 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73  bFunctionExpress
16fc0 69 6f 6e 20 65 2c 20 73 74 72 69 6e 67 20 66 75  ion e, string fu
16fd0 6e 63 74 69 6f 6e 4e 61 6d 65 29 0d 0a 20 20 20  nctionName)..   
16fe0 20 7b 0d 0a 20 20 20 20 20 20 53 71 6c 42 75 69   {..      SqlBui
16ff0 6c 64 65 72 20 72 65 73 75 6c 74 20 3d 20 6e 65  lder result = ne
17000 77 20 53 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d  w SqlBuilder();.
17010 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70  .      result.Ap
17020 70 65 6e 64 28 66 75 6e 63 74 69 6f 6e 4e 61 6d  pend(functionNam
17030 65 29 3b 0d 0a 20 20 20 20 20 20 48 61 6e 64 6c  e);..      Handl
17040 65 46 75 6e 63 74 69 6f 6e 41 72 67 75 6d 65 6e  eFunctionArgumen
17050 74 73 44 65 66 61 75 6c 74 28 65 2c 20 72 65 73  tsDefault(e, res
17060 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20 72 65 74  ult);..      ret
17070 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20  urn result;..   
17080 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
17090 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
170a0 20 44 65 66 61 75 6c 74 20 68 61 6e 64 6c 69 6e   Default handlin
170b0 67 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  g on function ar
170c0 67 75 6d 65 6e 74 73 0d 0a 20 20 20 20 2f 2f 2f  guments..    ///
170d0 20 41 70 70 65 6e 64 73 20 74 68 65 20 6c 69 73   Appends the lis
170e0 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  t of arguments t
170f0 6f 20 74 68 65 20 67 69 76 65 6e 20 72 65 73 75  o the given resu
17100 6c 74 0d 0a 20 20 20 20 2f 2f 2f 20 49 66 20 74  lt..    /// If t
17110 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  he function is n
17120 69 6c 61 64 69 63 20 69 74 20 64 6f 65 73 20 6e  iladic it does n
17130 6f 74 20 61 70 70 65 6e 64 20 61 6e 79 74 68 69  ot append anythi
17140 6e 67 2c 0d 0a 20 20 20 20 2f 2f 2f 20 6f 74 68  ng,..    /// oth
17150 65 72 77 69 73 65 20 69 74 20 61 70 70 65 6e 64  erwise it append
17160 73 20 28 61 72 67 31 2c 20 61 72 67 32 2c 20 2e  s (arg1, arg2, .
17170 2e 2e 2c 20 61 72 67 6e 29 0d 0a 20 20 20 20 2f  .., argn)..    /
17180 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
17190 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
171a0 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  me="e"></param>.
171b0 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
171c0 6e 61 6d 65 3d 22 72 65 73 75 6c 74 22 3e 3c 2f  name="result"></
171d0 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70 72 69 76  param>..    priv
171e0 61 74 65 20 76 6f 69 64 20 48 61 6e 64 6c 65 46  ate void HandleF
171f0 75 6e 63 74 69 6f 6e 41 72 67 75 6d 65 6e 74 73  unctionArguments
17200 44 65 66 61 75 6c 74 28 44 62 46 75 6e 63 74 69  Default(DbFuncti
17210 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20 65 2c 20  onExpression e, 
17220 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c  SqlBuilder resul
17230 74 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  t)..    {..     
17240 20 62 6f 6f 6c 20 69 73 4e 69 6c 61 64 69 63 46   bool isNiladicF
17250 75 6e 63 74 69 6f 6e 20 3d 20 4d 65 74 61 64 61  unction = Metada
17260 74 61 48 65 6c 70 65 72 73 2e 54 72 79 47 65 74  taHelpers.TryGet
17270 56 61 6c 75 65 46 6f 72 4d 65 74 61 64 61 74 61  ValueForMetadata
17280 50 72 6f 70 65 72 74 79 3c 62 6f 6f 6c 3e 28 65  Property<bool>(e
17290 2e 46 75 6e 63 74 69 6f 6e 2c 20 22 4e 69 6c 61  .Function, "Nila
172a0 64 69 63 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  dicFunctionAttri
172b0 62 75 74 65 22 29 3b 0d 0a 20 20 20 20 20 20 69  bute");..      i
172c0 66 20 28 69 73 4e 69 6c 61 64 69 63 46 75 6e 63  f (isNiladicFunc
172d0 74 69 6f 6e 20 26 26 20 65 2e 41 72 67 75 6d 65  tion && e.Argume
172e0 6e 74 73 2e 43 6f 75 6e 74 20 3e 20 30 29 0d 0a  nts.Count > 0)..
172f0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
17300 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
17310 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65 70  idOperationExcep
17320 74 69 6f 6e 28 22 4e 69 6c 61 64 69 63 20 66 75  tion("Niladic fu
17330 6e 63 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 68  nctions cannot h
17340 61 76 65 20 70 61 72 61 6d 65 74 65 72 73 22 29  ave parameters")
17350 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
17360 20 20 20 20 69 66 20 28 21 69 73 4e 69 6c 61 64      if (!isNilad
17370 69 63 46 75 6e 63 74 69 6f 6e 29 0d 0a 20 20 20  icFunction)..   
17380 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65     {..        re
17390 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 28 22 29  sult.Append("(")
173a0 3b 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ;..        strin
173b0 67 20 73 65 70 61 72 61 74 6f 72 20 3d 20 53 74  g separator = St
173c0 72 69 6e 67 2e 45 6d 70 74 79 3b 0d 0a 20 20 20  ring.Empty;..   
173d0 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 44 62       foreach (Db
173e0 45 78 70 72 65 73 73 69 6f 6e 20 61 72 67 20 69  Expression arg i
173f0 6e 20 65 2e 41 72 67 75 6d 65 6e 74 73 29 0d 0a  n e.Arguments)..
17400 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
17410 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
17420 6e 64 28 73 65 70 61 72 61 74 6f 72 29 3b 0d 0a  nd(separator);..
17430 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
17440 2e 41 70 70 65 6e 64 28 61 72 67 2e 41 63 63 65  .Append(arg.Acce
17450 70 74 28 74 68 69 73 29 29 3b 0d 0a 20 20 20 20  pt(this));..    
17460 20 20 20 20 20 20 73 65 70 61 72 61 74 6f 72 20        separator 
17470 3d 20 22 2c 20 22 3b 0d 0a 20 20 20 20 20 20 20  = ", ";..       
17480 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75   }..        resu
17490 6c 74 2e 41 70 70 65 6e 64 28 22 29 22 29 3b 0d  lt.Append(")");.
174a0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
174b0 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
174c0 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 61  ary>..    /// Ha
174d0 6e 64 6c 65 72 20 66 6f 72 20 73 70 65 63 69 61  ndler for specia
174e0 6c 20 62 75 69 6c 74 20 69 6e 20 66 75 6e 63 74  l built in funct
174f0 69 6f 6e 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ions..    /// </
17500 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
17510 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65  / <param name="e
17520 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  "></param>..    
17530 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72  /// <returns></r
17540 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 72 69  eturns>..    pri
17550 76 61 74 65 20 49 53 71 6c 46 72 61 67 6d 65 6e  vate ISqlFragmen
17560 74 20 48 61 6e 64 6c 65 53 70 65 63 69 61 6c 42  t HandleSpecialB
17570 75 69 6c 74 49 6e 46 75 6e 63 74 69 6f 6e 28 44  uiltInFunction(D
17580 62 46 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73  bFunctionExpress
17590 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20  ion e)..    {.. 
175a0 20 20 20 20 20 72 65 74 75 72 6e 20 48 61 6e 64       return Hand
175b0 6c 65 53 70 65 63 69 61 6c 46 75 6e 63 74 69 6f  leSpecialFunctio
175c0 6e 28 5f 62 75 69 6c 74 49 6e 46 75 6e 63 74 69  n(_builtInFuncti
175d0 6f 6e 48 61 6e 64 6c 65 72 73 2c 20 65 29 3b 0d  onHandlers, e);.
175e0 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
175f0 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
17600 20 2f 2f 2f 20 48 61 6e 64 6c 65 72 20 66 6f 72   /// Handler for
17610 20 73 70 65 63 69 61 6c 20 63 61 6e 6f 6e 69 63   special canonic
17620 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0d 0a 20 20  al functions..  
17630 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
17640 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
17650 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61   name="e"></para
17660 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
17670 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d  urns></returns>.
17680 0a 20 20 20 20 70 72 69 76 61 74 65 20 49 53 71  .    private ISq
17690 6c 46 72 61 67 6d 65 6e 74 20 48 61 6e 64 6c 65  lFragment Handle
176a0 53 70 65 63 69 61 6c 43 61 6e 6f 6e 69 63 61 6c  SpecialCanonical
176b0 46 75 6e 63 74 69 6f 6e 28 44 62 46 75 6e 63 74  Function(DbFunct
176c0 69 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20 65 29  ionExpression e)
176d0 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72  ..    {..      r
176e0 65 74 75 72 6e 20 48 61 6e 64 6c 65 53 70 65 63  eturn HandleSpec
176f0 69 61 6c 46 75 6e 63 74 69 6f 6e 28 5f 63 61 6e  ialFunction(_can
17700 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 48 61  onicalFunctionHa
17710 6e 64 6c 65 72 73 2c 20 65 29 3b 0d 0a 20 20 20  ndlers, e);..   
17720 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
17730 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
17740 20 44 69 73 70 61 74 63 68 65 73 20 74 68 65 20   Dispatches the 
17750 73 70 65 63 69 61 6c 20 66 75 6e 63 74 69 6f 6e  special function
17760 20 70 72 6f 63 65 73 73 69 6e 67 20 74 6f 20 74   processing to t
17770 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 68  he appropriate h
17780 61 6e 64 6c 65 72 0d 0a 20 20 20 20 2f 2f 2f 20  andler..    /// 
17790 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
177a0 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
177b0 22 68 61 6e 64 6c 65 72 73 22 3e 3c 2f 70 61 72  "handlers"></par
177c0 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
177d0 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70  ram name="e"></p
177e0 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
177f0 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e  returns></return
17800 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  s>..    private 
17810 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 48 61 6e  ISqlFragment Han
17820 64 6c 65 53 70 65 63 69 61 6c 46 75 6e 63 74 69  dleSpecialFuncti
17830 6f 6e 28 44 69 63 74 69 6f 6e 61 72 79 3c 73 74  on(Dictionary<st
17840 72 69 6e 67 2c 20 46 75 6e 63 74 69 6f 6e 48 61  ring, FunctionHa
17850 6e 64 6c 65 72 3e 20 68 61 6e 64 6c 65 72 73 2c  ndler> handlers,
17860 20 44 62 46 75 6e 63 74 69 6f 6e 45 78 70 72 65   DbFunctionExpre
17870 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d  ssion e)..    {.
17880 0a 20 20 20 20 20 20 69 66 20 28 21 68 61 6e 64  .      if (!hand
17890 6c 65 72 73 2e 43 6f 6e 74 61 69 6e 73 4b 65 79  lers.ContainsKey
178a0 28 65 2e 46 75 6e 63 74 69 6f 6e 2e 4e 61 6d 65  (e.Function.Name
178b0 29 29 0d 0a 20 20 20 20 20 20 20 20 74 68 72 6f  ))..        thro
178c0 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f 70 65  w new InvalidOpe
178d0 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 28  rationException(
178e0 22 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e  "Special handlin
178f0 67 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  g should be call
17900 65 64 20 6f 6e 6c 79 20 66 6f 72 20 66 75 6e 63  ed only for func
17910 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  tions in the lis
17920 74 20 6f 66 20 73 70 65 63 69 61 6c 20 66 75 6e  t of special fun
17930 63 74 69 6f 6e 73 22 29 3b 0d 0a 0d 0a 20 20 20  ctions");....   
17940 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
17950 72 73 5b 65 2e 46 75 6e 63 74 69 6f 6e 2e 4e 61  rs[e.Function.Na
17960 6d 65 5d 28 74 68 69 73 2c 20 65 29 3b 0d 0a 20  me](this, e);.. 
17970 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
17980 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
17990 2f 2f 20 48 61 6e 64 6c 65 73 20 66 75 6e 63 74  // Handles funct
179a0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74 72  ions that are tr
179b0 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 54 53  anslated into TS
179c0 51 4c 20 6f 70 65 72 61 74 6f 72 73 2e 0d 0a 20  QL operators... 
179d0 20 20 20 2f 2f 2f 20 54 68 65 20 67 69 76 65 6e     /// The given
179e0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
179f0 20 68 61 76 65 20 6f 6e 65 20 6f 72 20 74 77 6f   have one or two
17a00 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 20 20 20   arguments...   
17a10 20 2f 2f 2f 20 46 75 6e 63 74 69 6f 6e 73 20 77   /// Functions w
17a20 69 74 68 20 6f 6e 65 20 61 72 67 75 65 6d 6e 74  ith one arguemnt
17a30 20 61 72 65 20 74 72 61 6e 73 6c 61 74 65 64 20   are translated 
17a40 69 6e 74 6f 0d 0a 20 20 20 20 2f 2f 2f 20 20 20  into..    ///   
17a50 20 20 6f 70 20 61 72 67 0d 0a 20 20 20 20 2f 2f    op arg..    //
17a60 2f 20 46 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  / Functions with
17a70 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 61   two arguments a
17a80 72 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  re translated in
17a90 74 6f 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20  to..    ///     
17aa0 61 72 67 30 20 6f 70 20 61 72 67 31 0d 0a 20 20  arg0 op arg1..  
17ab0 20 20 2f 2f 2f 20 41 6c 73 6f 2c 20 74 68 65 20    /// Also, the 
17ac0 61 72 67 75 6d 65 6e 74 73 20 63 61 6e 20 62 65  arguments can be
17ad0 20 6f 70 74 69 6f 6e 61 6c 79 20 65 6e 63 6c 6f   optionaly enclo
17ae0 73 65 64 20 69 6e 20 70 61 72 65 74 68 65 73 69  sed in parethesi
17af0 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  s..    /// </sum
17b00 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
17b10 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c  param name="e"><
17b20 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
17b30 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 61   <param name="pa
17b40 72 65 6e 74 68 65 73 69 73 65 41 72 67 75 6d 65  renthesiseArgume
17b50 6e 74 73 22 3e 57 68 65 74 68 65 72 20 74 68 65  nts">Whether the
17b60 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
17b70 64 20 62 65 20 65 6e 63 6c 6f 73 65 64 20 69 6e  d be enclosed in
17b80 20 70 61 72 65 74 68 65 73 69 73 3c 2f 70 61 72   parethesis</par
17b90 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  am>..    /// <re
17ba0 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e  turns></returns>
17bb0 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 49 53  ..    private IS
17bc0 71 6c 46 72 61 67 6d 65 6e 74 20 48 61 6e 64 6c  qlFragment Handl
17bd0 65 53 70 65 63 69 61 6c 46 75 6e 63 74 69 6f 6e  eSpecialFunction
17be0 54 6f 4f 70 65 72 61 74 6f 72 28 44 62 46 75 6e  ToOperator(DbFun
17bf0 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20  ctionExpression 
17c00 65 2c 20 62 6f 6f 6c 20 70 61 72 65 6e 74 68 65  e, bool parenthe
17c10 73 69 73 65 41 72 67 75 6d 65 6e 74 73 29 0d 0a  siseArguments)..
17c20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 71 6c      {..      Sql
17c30 42 75 69 6c 64 65 72 20 72 65 73 75 6c 74 20 3d  Builder result =
17c40 20 6e 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28   new SqlBuilder(
17c50 29 3b 0d 0a 20 20 20 20 20 20 44 65 62 75 67 2e  );..      Debug.
17c60 41 73 73 65 72 74 28 65 2e 41 72 67 75 6d 65 6e  Assert(e.Argumen
17c70 74 73 2e 43 6f 75 6e 74 20 3e 20 30 20 26 26 20  ts.Count > 0 && 
17c80 65 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75 6e  e.Arguments.Coun
17c90 74 20 3c 3d 20 32 2c 20 22 54 68 65 72 65 20 73  t <= 2, "There s
17ca0 68 6f 75 6c 64 20 62 65 20 31 20 6f 72 20 32 20  hould be 1 or 2 
17cb0 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 6f 70  arguments for op
17cc0 65 72 61 74 6f 72 22 29 3b 0d 0a 0d 0a 20 20 20  erator");....   
17cd0 20 20 20 69 66 20 28 65 2e 41 72 67 75 6d 65 6e     if (e.Argumen
17ce0 74 73 2e 43 6f 75 6e 74 20 3e 20 31 29 0d 0a 20  ts.Count > 1).. 
17cf0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
17d00 69 66 20 28 70 61 72 65 6e 74 68 65 73 69 73 65  if (parenthesise
17d10 41 72 67 75 6d 65 6e 74 73 29 0d 0a 20 20 20 20  Arguments)..    
17d20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
17d30 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22   result.Append("
17d40 28 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  (");..        }.
17d50 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e  .        result.
17d60 41 70 70 65 6e 64 28 65 2e 41 72 67 75 6d 65 6e  Append(e.Argumen
17d70 74 73 5b 30 5d 2e 41 63 63 65 70 74 28 74 68 69  ts[0].Accept(thi
17d80 73 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66  s));..        if
17d90 20 28 70 61 72 65 6e 74 68 65 73 69 73 65 41 72   (parenthesiseAr
17da0 67 75 6d 65 6e 74 73 29 0d 0a 20 20 20 20 20 20  guments)..      
17db0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72    {..          r
17dc0 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 29 22  esult.Append(")"
17dd0 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
17de0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65       }..      re
17df0 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 20 22 29  sult.Append(" ")
17e00 3b 0d 0a 20 20 20 20 20 20 44 65 62 75 67 2e 41  ;..      Debug.A
17e10 73 73 65 72 74 28 5f 66 75 6e 63 74 69 6f 6e 4e  ssert(_functionN
17e20 61 6d 65 54 6f 4f 70 65 72 61 74 6f 72 44 69 63  ameToOperatorDic
17e30 74 69 6f 6e 61 72 79 2e 43 6f 6e 74 61 69 6e 73  tionary.Contains
17e40 4b 65 79 28 65 2e 46 75 6e 63 74 69 6f 6e 2e 4e  Key(e.Function.N
17e50 61 6d 65 29 2c 20 22 54 68 65 20 66 75 6e 63 74  ame), "The funct
17e60 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 6d  ion can not be m
17e70 61 70 70 65 64 20 74 6f 20 61 6e 20 6f 70 65 72  apped to an oper
17e80 61 74 6f 72 22 29 3b 0d 0a 20 20 20 20 20 20 72  ator");..      r
17e90 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 5f 66 75  esult.Append(_fu
17ea0 6e 63 74 69 6f 6e 4e 61 6d 65 54 6f 4f 70 65 72  nctionNameToOper
17eb0 61 74 6f 72 44 69 63 74 69 6f 6e 61 72 79 5b 65  atorDictionary[e
17ec0 2e 46 75 6e 63 74 69 6f 6e 2e 4e 61 6d 65 5d 29  .Function.Name])
17ed0 3b 0d 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e  ;..      result.
17ee0 41 70 70 65 6e 64 28 22 20 22 29 3b 0d 0a 0d 0a  Append(" ");....
17ef0 20 20 20 20 20 20 69 66 20 28 70 61 72 65 6e 74        if (parent
17f00 68 65 73 69 73 65 41 72 67 75 6d 65 6e 74 73 29  hesiseArguments)
17f10 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
17f20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
17f30 28 22 28 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ("(");..      }.
17f40 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70  .      result.Ap
17f50 70 65 6e 64 28 65 2e 41 72 67 75 6d 65 6e 74 73  pend(e.Arguments
17f60 5b 65 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75  [e.Arguments.Cou
17f70 6e 74 20 2d 20 31 5d 2e 41 63 63 65 70 74 28 74  nt - 1].Accept(t
17f80 68 69 73 29 29 3b 0d 0a 20 20 20 20 20 20 69 66  his));..      if
17f90 20 28 70 61 72 65 6e 74 68 65 73 69 73 65 41 72   (parenthesiseAr
17fa0 67 75 6d 65 6e 74 73 29 0d 0a 20 20 20 20 20 20  guments)..      
17fb0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  {..        resul
17fc0 74 2e 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a  t.Append(")");..
17fd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72        }..      r
17fe0 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20  eturn result;.. 
17ff0 20 20 20 7d 0d 0a 0d 0a 0d 0a 20 20 20 20 2f 2f     }......    //
18000 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
18010 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22   /// <see cref="
18020 48 61 6e 64 6c 65 53 70 65 63 69 61 6c 46 75 6e  HandleSpecialFun
18030 63 74 69 6f 6e 54 6f 4f 70 65 72 61 74 6f 72 22  ctionToOperator"
18040 3e 3c 2f 73 65 65 3e 0d 0a 20 20 20 20 2f 2f 2f  ></see>..    ///
18050 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
18060 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
18070 3d 22 73 71 6c 67 65 6e 22 3e 3c 2f 70 61 72 61  ="sqlgen"></para
18080 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
18090 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61  am name="e"></pa
180a0 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
180b0 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73  eturns></returns
180c0 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  >..    private s
180d0 74 61 74 69 63 20 49 53 71 6c 46 72 61 67 6d 65  tatic ISqlFragme
180e0 6e 74 20 48 61 6e 64 6c 65 43 6f 6e 63 61 74 46  nt HandleConcatF
180f0 75 6e 63 74 69 6f 6e 28 53 71 6c 47 65 6e 65 72  unction(SqlGener
18100 61 74 6f 72 20 73 71 6c 67 65 6e 2c 20 44 62 46  ator sqlgen, DbF
18110 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f  unctionExpressio
18120 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n e)..    {..   
18130 20 20 20 72 65 74 75 72 6e 20 73 71 6c 67 65 6e     return sqlgen
18140 2e 48 61 6e 64 6c 65 53 70 65 63 69 61 6c 46 75  .HandleSpecialFu
18150 6e 63 74 69 6f 6e 54 6f 4f 70 65 72 61 74 6f 72  nctionToOperator
18160 28 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20  (e, false);..   
18170 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
18180 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
18190 20 3c 73 65 65 20 63 72 65 66 3d 22 48 61 6e 64   <see cref="Hand
181a0 6c 65 53 70 65 63 69 61 6c 46 75 6e 63 74 69 6f  leSpecialFunctio
181b0 6e 54 6f 4f 70 65 72 61 74 6f 72 22 3e 3c 2f 73  nToOperator"></s
181c0 65 65 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ee>..    /// </s
181d0 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
181e0 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 71   <param name="sq
181f0 6c 67 65 6e 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  lgen"></param>..
18200 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
18210 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e  ame="e"></param>
18220 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72  ..    /// <retur
18230 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  ns></returns>.. 
18240 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
18250 63 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 48  c ISqlFragment H
18260 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75  andleCanonicalFu
18270 6e 63 74 69 6f 6e 42 69 74 77 69 73 65 28 53 71  nctionBitwise(Sq
18280 6c 47 65 6e 65 72 61 74 6f 72 20 73 71 6c 67 65  lGenerator sqlge
18290 6e 2c 20 44 62 46 75 6e 63 74 69 6f 6e 45 78 70  n, DbFunctionExp
182a0 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ression e)..    
182b0 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
182c0 73 71 6c 67 65 6e 2e 48 61 6e 64 6c 65 53 70 65  sqlgen.HandleSpe
182d0 63 69 61 6c 46 75 6e 63 74 69 6f 6e 54 6f 4f 70  cialFunctionToOp
182e0 65 72 61 74 6f 72 28 65 2c 20 74 72 75 65 29 3b  erator(e, true);
182f0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70  ..    }....    p
18300 72 69 76 61 74 65 20 73 74 61 74 69 63 20 49 53  rivate static IS
18310 71 6c 46 72 61 67 6d 65 6e 74 20 48 61 6e 64 6c  qlFragment Handl
18320 65 47 65 74 44 61 74 65 46 75 6e 63 74 69 6f 6e  eGetDateFunction
18330 28 53 71 6c 47 65 6e 65 72 61 74 6f 72 20 73 71  (SqlGenerator sq
18340 6c 67 65 6e 2c 20 44 62 46 75 6e 63 74 69 6f 6e  lgen, DbFunction
18350 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20  Expression e).. 
18360 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 71 6c 42     {..      SqlB
18370 75 69 6c 64 65 72 20 72 65 73 75 6c 74 20 3d 20  uilder result = 
18380 6e 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28 29  new SqlBuilder()
18390 3b 0d 0a 20 20 20 20 20 20 44 65 62 75 67 2e 41  ;..      Debug.A
183a0 73 73 65 72 74 28 65 2e 41 72 67 75 6d 65 6e 74  ssert(e.Argument
183b0 73 2e 43 6f 75 6e 74 20 3d 3d 20 30 2c 20 22 43  s.Count == 0, "C
183c0 61 6e 6f 6e 69 63 61 6c 20 67 65 74 64 61 74 65  anonical getdate
183d0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
183e0 20 68 61 76 65 20 6e 6f 20 61 72 67 75 6d 65 6e   have no argumen
183f0 74 73 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 73  ts");....      s
18400 77 69 74 63 68 20 28 73 71 6c 67 65 6e 2e 5f 6d  witch (sqlgen._m
18410 61 6e 69 66 65 73 74 2e 5f 64 61 74 65 54 69 6d  anifest._dateTim
18420 65 46 6f 72 6d 61 74 29 0d 0a 20 20 20 20 20 20  eFormat)..      
18430 7b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  {..        case 
18440 53 51 4c 69 74 65 44 61 74 65 46 6f 72 6d 61 74  SQLiteDateFormat
18450 73 2e 54 69 63 6b 73 3a 0d 0a 20 20 20 20 20 20  s.Ticks:..      
18460 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e      result.Appen
18470 64 28 22 28 53 54 52 46 54 49 4d 45 28 27 25 73  d("(STRFTIME('%s
18480 27 2c 20 27 6e 6f 77 27 29 20 2a 20 31 30 30 30  ', 'now') * 1000
18490 30 30 30 30 20 2b 20 36 32 31 33 35 35 39 36 38  0000 + 621355968
184a0 30 30 30 30 30 30 30 30 30 29 22 29 3b 0d 0a 20  000000000)");.. 
184b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d           break;.
184c0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
184d0 4c 69 74 65 44 61 74 65 46 6f 72 6d 61 74 73 2e  LiteDateFormats.
184e0 4a 75 6c 69 61 6e 44 61 79 3a 0d 0a 20 20 20 20  JulianDay:..    
184f0 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
18500 65 6e 64 28 22 43 41 53 54 28 53 54 52 46 54 49  end("CAST(STRFTI
18510 4d 45 28 27 25 4a 27 2c 20 27 6e 6f 77 27 29 20  ME('%J', 'now') 
18520 41 53 20 64 6f 75 62 6c 65 29 22 29 3b 0d 0a 20  AS double)");.. 
18530 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d           break;.
18540 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
18550 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  :..          res
18560 75 6c 74 2e 41 70 70 65 6e 64 28 22 53 54 52 46  ult.Append("STRF
18570 54 49 4d 45 28 27 25 59 2d 25 6d 2d 25 64 20 25  TIME('%Y-%m-%d %
18580 48 3a 25 4d 3a 25 53 27 2c 20 27 6e 6f 77 27 29  H:%M:%S', 'now')
18590 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  ");..          b
185a0 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  reak;..      }..
185b0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ..      return r
185c0 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  esult;..    }...
185d0 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
185e0 74 69 63 20 49 53 71 6c 46 72 61 67 6d 65 6e 74  tic ISqlFragment
185f0 20 48 61 6e 64 6c 65 47 65 74 55 74 63 44 61 74   HandleGetUtcDat
18600 65 46 75 6e 63 74 69 6f 6e 28 53 71 6c 47 65 6e  eFunction(SqlGen
18610 65 72 61 74 6f 72 20 73 71 6c 67 65 6e 2c 20 44  erator sqlgen, D
18620 62 46 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73  bFunctionExpress
18630 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20  ion e)..    {.. 
18640 20 20 20 20 20 53 71 6c 42 75 69 6c 64 65 72 20       SqlBuilder 
18650 72 65 73 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c  result = new Sql
18660 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20  Builder();..    
18670 20 20 44 65 62 75 67 2e 41 73 73 65 72 74 28 65    Debug.Assert(e
18680 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75 6e 74  .Arguments.Count
18690 20 3d 3d 20 30 2c 20 22 43 61 6e 6f 6e 69 63 61   == 0, "Canonica
186a0 6c 20 67 65 74 75 74 63 64 61 74 65 20 66 75 6e  l getutcdate fun
186b0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76  ction should hav
186c0 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 22 29  e no arguments")
186d0 3b 0d 0a 0d 0a 20 20 20 20 20 20 73 77 69 74 63  ;....      switc
186e0 68 20 28 73 71 6c 67 65 6e 2e 5f 6d 61 6e 69 66  h (sqlgen._manif
186f0 65 73 74 2e 5f 64 61 74 65 54 69 6d 65 46 6f 72  est._dateTimeFor
18700 6d 61 74 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  mat)..      {.. 
18710 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 69         case SQLi
18720 74 65 44 61 74 65 46 6f 72 6d 61 74 73 2e 54 69  teDateFormats.Ti
18730 63 6b 73 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  cks:..          
18740 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 28  result.Append("(
18750 53 54 52 46 54 49 4d 45 28 27 25 73 27 2c 20 27  STRFTIME('%s', '
18760 6e 6f 77 27 2c 20 27 75 74 63 27 29 20 2a 20 31  now', 'utc') * 1
18770 30 30 30 30 30 30 30 20 2b 20 36 32 31 33 35 35  0000000 + 621355
18780 39 36 38 30 30 30 30 30 30 30 30 30 29 22 29 3b  968000000000)");
18790 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ..          brea
187a0 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65  k;..        case
187b0 20 53 51 4c 69 74 65 44 61 74 65 46 6f 72 6d 61   SQLiteDateForma
187c0 74 73 2e 4a 75 6c 69 61 6e 44 61 79 3a 0d 0a 20  ts.JulianDay:.. 
187d0 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e           result.
187e0 41 70 70 65 6e 64 28 22 43 41 53 54 28 53 54 52  Append("CAST(STR
187f0 46 54 49 4d 45 28 27 25 4a 27 2c 20 27 6e 6f 77  FTIME('%J', 'now
18800 27 2c 20 27 75 74 63 27 29 20 41 53 20 64 6f 75  ', 'utc') AS dou
18810 62 6c 65 29 22 29 3b 0d 0a 20 20 20 20 20 20 20  ble)");..       
18820 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
18830 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20 20     default:..   
18840 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70         result.Ap
18850 70 65 6e 64 28 22 53 54 52 46 54 49 4d 45 28 27  pend("STRFTIME('
18860 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25  %Y-%m-%d %H:%M:%
18870 53 27 2c 20 27 6e 6f 77 27 2c 20 27 75 74 63 27  S', 'now', 'utc'
18880 29 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  )");..          
18890 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d  break;..      }.
188a0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
188b0 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a  result;..    }..
188c0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
188d0 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 61 6e  ry>..    /// Han
188e0 64 6c 65 73 20 73 70 65 63 69 61 6c 20 63 61 73  dles special cas
188f0 65 20 69 6e 20 77 68 69 63 68 20 64 61 74 65 70  e in which datep
18900 61 72 74 20 27 74 79 70 65 27 20 70 61 72 61 6d  art 'type' param
18910 65 74 65 72 20 69 73 20 70 72 65 73 65 6e 74 2e  eter is present.
18920 20 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f   all the functio
18930 6e 73 0d 0a 20 20 20 20 2f 2f 2f 20 68 61 6e 64  ns..    /// hand
18940 6c 65 73 20 68 65 72 65 20 68 61 76 65 20 2a 6f  les here have *o
18950 6e 6c 79 2a 20 74 68 65 20 31 73 74 20 70 61 72  nly* the 1st par
18960 61 6d 65 74 65 72 20 61 73 20 64 61 74 65 70 61  ameter as datepa
18970 72 74 2e 20 64 61 74 65 70 61 72 74 20 76 61 6c  rt. datepart val
18980 75 65 20 69 73 20 70 61 73 73 65 64 20 61 6c 6f  ue is passed alo
18990 6e 67 0d 0a 20 20 20 20 2f 2f 2f 20 74 68 65 20  ng..    /// the 
189a0 51 50 20 61 73 20 73 74 72 69 6e 67 20 61 6e 64  QP as string and
189b0 20 68 61 73 20 74 6f 20 62 65 20 65 78 70 61 6e   has to be expan
189c0 64 65 64 20 61 73 20 54 53 51 4c 20 6b 65 79 77  ded as TSQL keyw
189d0 6f 72 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ord...    /// </
189e0 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
189f0 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73  / <param name="s
18a00 71 6c 67 65 6e 22 3e 3c 2f 70 61 72 61 6d 3e 0d  qlgen"></param>.
18a10 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
18a20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d  name="e"></param
18a30 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
18a40 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  rns></returns>..
18a50 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
18a60 69 63 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20  ic ISqlFragment 
18a70 48 61 6e 64 6c 65 44 61 74 65 70 61 72 74 44 61  HandleDatepartDa
18a80 74 65 46 75 6e 63 74 69 6f 6e 28 53 71 6c 47 65  teFunction(SqlGe
18a90 6e 65 72 61 74 6f 72 20 73 71 6c 67 65 6e 2c 20  nerator sqlgen, 
18aa0 44 62 46 75 6e 63 74 69 6f 6e 45 78 70 72 65 73  DbFunctionExpres
18ab0 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a  sion e)..    {..
18ac0 20 20 20 20 20 20 44 65 62 75 67 2e 41 73 73 65        Debug.Asse
18ad0 72 74 28 65 2e 41 72 67 75 6d 65 6e 74 73 2e 43  rt(e.Arguments.C
18ae0 6f 75 6e 74 20 3d 3d 20 32 2c 20 22 64 61 74 65  ount == 2, "date
18af0 70 61 72 74 20 66 75 6e 63 74 69 6f 6e 20 6d 75  part function mu
18b00 73 74 20 68 61 76 65 20 32 20 61 72 67 75 6d 65  st have 2 argume
18b10 6e 74 73 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  nts");....      
18b20 44 62 43 6f 6e 73 74 61 6e 74 45 78 70 72 65 73  DbConstantExpres
18b30 73 69 6f 6e 20 63 6f 6e 73 74 45 78 70 72 20 3d  sion constExpr =
18b40 20 65 2e 41 72 67 75 6d 65 6e 74 73 5b 30 5d 20   e.Arguments[0] 
18b50 61 73 20 44 62 43 6f 6e 73 74 61 6e 74 45 78 70  as DbConstantExp
18b60 72 65 73 73 69 6f 6e 3b 0d 0a 20 20 20 20 20 20  ression;..      
18b70 69 66 20 28 6e 75 6c 6c 20 3d 3d 20 63 6f 6e 73  if (null == cons
18b80 74 45 78 70 72 29 0d 0a 20 20 20 20 20 20 7b 0d  tExpr)..      {.
18b90 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e  .        throw n
18ba0 65 77 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74  ew InvalidOperat
18bb0 69 6f 6e 45 78 63 65 70 74 69 6f 6e 28 53 74 72  ionException(Str
18bc0 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44 41 54 45  ing.Format("DATE
18bd0 50 41 52 54 20 61 72 67 75 6d 65 6e 74 20 74 6f  PART argument to
18be0 20 66 75 6e 63 74 69 6f 6e 20 27 7b 30 7d 2e 7b   function '{0}.{
18bf0 31 7d 27 20 6d 75 73 74 20 62 65 20 61 20 6c 69  1}' must be a li
18c00 74 65 72 61 6c 20 73 74 72 69 6e 67 22 2c 20 65  teral string", e
18c10 2e 46 75 6e 63 74 69 6f 6e 2e 4e 61 6d 65 73 70  .Function.Namesp
18c20 61 63 65 4e 61 6d 65 2c 20 65 2e 46 75 6e 63 74  aceName, e.Funct
18c30 69 6f 6e 2e 4e 61 6d 65 29 29 3b 0d 0a 20 20 20  ion.Name));..   
18c40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 74     }....      st
18c50 72 69 6e 67 20 64 61 74 65 70 61 72 74 20 3d 20  ring datepart = 
18c60 63 6f 6e 73 74 45 78 70 72 2e 56 61 6c 75 65 20  constExpr.Value 
18c70 61 73 20 73 74 72 69 6e 67 3b 0d 0a 20 20 20 20  as string;..    
18c80 20 20 69 66 20 28 6e 75 6c 6c 20 3d 3d 20 64 61    if (null == da
18c90 74 65 70 61 72 74 29 0d 0a 20 20 20 20 20 20 7b  tepart)..      {
18ca0 0d 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20  ..        throw 
18cb0 6e 65 77 20 49 6e 76 61 6c 69 64 4f 70 65 72 61  new InvalidOpera
18cc0 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 28 53 74  tionException(St
18cd0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44 41 54  ring.Format("DAT
18ce0 45 50 41 52 54 20 61 72 67 75 6d 65 6e 74 20 74  EPART argument t
18cf0 6f 20 66 75 6e 63 74 69 6f 6e 20 27 7b 30 7d 2e  o function '{0}.
18d00 7b 31 7d 27 20 6d 75 73 74 20 62 65 20 61 20 6c  {1}' must be a l
18d10 69 74 65 72 61 6c 20 73 74 72 69 6e 67 22 2c 20  iteral string", 
18d20 65 2e 46 75 6e 63 74 69 6f 6e 2e 4e 61 6d 65 73  e.Function.Names
18d30 70 61 63 65 4e 61 6d 65 2c 20 65 2e 46 75 6e 63  paceName, e.Func
18d40 74 69 6f 6e 2e 4e 61 6d 65 29 29 3b 0d 0a 20 20  tion.Name));..  
18d50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 53      }....      S
18d60 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c 74  qlBuilder result
18d70 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64 65   = new SqlBuilde
18d80 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f  r();....      //
18d90 0d 0a 20 20 20 20 20 20 2f 2f 20 63 68 65 63 6b  ..      // check
18da0 20 69 66 20 64 61 74 65 70 61 72 74 20 76 61 6c   if datepart val
18db0 75 65 20 69 73 20 76 61 6c 69 64 0d 0a 20 20 20  ue is valid..   
18dc0 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 73 74 72     //..      str
18dd0 69 6e 67 20 74 72 61 6e 73 3b 0d 0a 20 20 20 20  ing trans;..    
18de0 20 20 69 66 20 28 21 5f 64 61 74 65 70 61 72 74    if (!_datepart
18df0 4b 65 79 77 6f 72 64 73 2e 54 72 79 47 65 74 56  Keywords.TryGetV
18e00 61 6c 75 65 28 64 61 74 65 70 61 72 74 2c 20 6f  alue(datepart, o
18e10 75 74 20 74 72 61 6e 73 29 29 0d 0a 20 20 20 20  ut trans))..    
18e20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 68 72    {..        thr
18e30 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f 70  ow new InvalidOp
18e40 65 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e  erationException
18e50 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
18e60 7b 30 7d 27 20 69 73 20 6e 6f 74 20 61 20 76 61  {0}' is not a va
18e70 6c 69 64 20 76 61 6c 75 65 20 66 6f 72 20 44 41  lid value for DA
18e80 54 45 50 41 52 54 20 61 72 67 75 6d 65 6e 74 20  TEPART argument 
18e90 69 6e 20 27 7b 31 7d 2e 7b 32 7d 27 20 66 75 6e  in '{1}.{2}' fun
18ea0 63 74 69 6f 6e 22 2c 20 64 61 74 65 70 61 72 74  ction", datepart
18eb0 2c 20 65 2e 46 75 6e 63 74 69 6f 6e 2e 4e 61 6d  , e.Function.Nam
18ec0 65 73 70 61 63 65 4e 61 6d 65 2c 20 65 2e 46 75  espaceName, e.Fu
18ed0 6e 63 74 69 6f 6e 2e 4e 61 6d 65 29 29 3b 0d 0a  nction.Name));..
18ee0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18ef0 20 69 66 20 28 74 72 61 6e 73 20 21 3d 20 22 25   if (trans != "%
18f00 66 22 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  f")..      {..  
18f10 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
18f20 65 6e 64 28 22 43 41 53 54 28 53 54 52 46 54 49  end("CAST(STRFTI
18f30 4d 45 28 27 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  ME('");....     
18f40 20 20 20 2f 2f 20 65 78 70 61 6e 64 20 74 68 65     // expand the
18f50 20 64 61 74 65 70 61 72 74 20 6c 69 74 65 72 61   datepart litera
18f60 6c 20 61 73 20 74 73 71 6c 20 6b 77 6f 72 64 0d  l as tsql kword.
18f70 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e  .        result.
18f80 41 70 70 65 6e 64 28 74 72 61 6e 73 29 3b 0d 0a  Append(trans);..
18f90 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41          result.A
18fa0 70 70 65 6e 64 28 22 27 2c 20 22 29 3b 0d 0a 0d  ppend("', ");...
18fb0 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20  .        switch 
18fc0 28 73 71 6c 67 65 6e 2e 5f 6d 61 6e 69 66 65 73  (sqlgen._manifes
18fd0 74 2e 5f 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  t._dateTimeForma
18fe0 74 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  t)..        {.. 
18ff0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
19000 4c 69 74 65 44 61 74 65 46 6f 72 6d 61 74 73 2e  LiteDateFormats.
19010 54 69 63 6b 73 3a 0d 0a 20 20 20 20 20 20 20 20  Ticks:..        
19020 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e      result.Appen
19030 64 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  d(String.Format(
19040 22 28 28 7b 30 7d 20 2d 20 36 32 31 33 35 35 39  "(({0} - 6213559
19050 36 38 30 30 30 30 30 30 30 30 30 29 20 2f 20 31  68000000000) / 1
19060 30 30 30 30 30 30 30 2e 30 29 22 2c 20 65 2e 41  0000000.0)", e.A
19070 72 67 75 6d 65 6e 74 73 5b 31 5d 2e 41 63 63 65  rguments[1].Acce
19080 70 74 28 73 71 6c 67 65 6e 29 29 29 3b 0d 0a 20  pt(sqlgen)));.. 
19090 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
190a0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 66  ;..          def
190b0 61 75 6c 74 3a 0d 0a 20 20 20 20 20 20 20 20 20  ault:..         
190c0 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
190d0 28 65 2e 41 72 67 75 6d 65 6e 74 73 5b 31 5d 2e  (e.Arguments[1].
190e0 41 63 63 65 70 74 28 73 71 6c 67 65 6e 29 29 3b  Accept(sqlgen));
190f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ..            br
19100 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  eak;..        }.
19110 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  ...        resul
19120 74 2e 41 70 70 65 6e 64 28 22 29 20 41 53 20 69  t.Append(") AS i
19130 6e 74 65 67 65 72 29 22 29 3b 0d 0a 20 20 20 20  nteger)");..    
19140 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65 0d    }..      else.
19150 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
19160 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
19170 22 43 41 53 54 28 53 55 42 53 54 52 28 53 54 52  "CAST(SUBSTR(STR
19180 46 54 49 4d 45 28 27 25 66 27 2c 20 22 29 3b 0d  FTIME('%f', ");.
19190 0a 0d 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  ...        switc
191a0 68 20 28 73 71 6c 67 65 6e 2e 5f 6d 61 6e 69 66  h (sqlgen._manif
191b0 65 73 74 2e 5f 64 61 74 65 54 69 6d 65 46 6f 72  est._dateTimeFor
191c0 6d 61 74 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  mat)..        {.
191d0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
191e0 53 51 4c 69 74 65 44 61 74 65 46 6f 72 6d 61 74  SQLiteDateFormat
191f0 73 2e 54 69 63 6b 73 3a 0d 0a 20 20 20 20 20 20  s.Ticks:..      
19200 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
19210 65 6e 64 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  end(String.Forma
19220 74 28 22 28 28 7b 30 7d 20 2d 20 36 32 31 33 35  t("(({0} - 62135
19230 35 39 36 38 30 30 30 30 30 30 30 30 30 29 20 2f  5968000000000) /
19240 20 31 30 30 30 30 30 30 30 2e 30 29 22 2c 20 65   10000000.0)", e
19250 2e 41 72 67 75 6d 65 6e 74 73 5b 31 5d 2e 41 63  .Arguments[1].Ac
19260 63 65 70 74 28 73 71 6c 67 65 6e 29 29 29 3b 0d  cept(sqlgen)));.
19270 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
19280 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64  ak;..          d
19290 65 66 61 75 6c 74 3a 0d 0a 20 20 20 20 20 20 20  efault:..       
192a0 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
192b0 6e 64 28 65 2e 41 72 67 75 6d 65 6e 74 73 5b 31  nd(e.Arguments[1
192c0 5d 2e 41 63 63 65 70 74 28 73 71 6c 67 65 6e 29  ].Accept(sqlgen)
192d0 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
192e0 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20  break;..        
192f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 73  }....        res
19300 75 6c 74 2e 41 70 70 65 6e 64 28 22 29 2c 20 34  ult.Append("), 4
19310 29 20 41 53 20 69 6e 74 65 67 65 72 29 22 29 3b  ) AS integer)");
19320 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
19330 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
19340 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
19350 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
19360 20 20 20 2f 2f 2f 20 44 61 74 65 41 64 64 28 64     /// DateAdd(d
19370 61 74 65 74 69 6d 65 2c 20 73 65 63 6f 6e 64 73  atetime, seconds
19380 54 6f 41 64 64 29 20 2d 3e 20 44 41 54 45 41 44  ToAdd) -> DATEAD
19390 44 20 28 20 73 65 63 6f 6e 64 73 20 2c 20 6e 75  D ( seconds , nu
193a0 6d 62 65 72 2c 20 20 64 61 74 65 29 0d 0a 20 20  mber,  date)..  
193b0 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
193c0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
193d0 20 6e 61 6d 65 3d 22 73 71 6c 67 65 6e 22 3e 3c   name="sqlgen"><
193e0 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
193f0 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22   <param name="e"
19400 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  ></param>..    /
19410 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65  // <returns></re
19420 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 72 69 76  turns>..    priv
19430 61 74 65 20 73 74 61 74 69 63 20 49 53 71 6c 46  ate static ISqlF
19440 72 61 67 6d 65 6e 74 20 48 61 6e 64 6c 65 43 61  ragment HandleCa
19450 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 44  nonicalFunctionD
19460 61 74 65 41 64 64 28 53 71 6c 47 65 6e 65 72 61  ateAdd(SqlGenera
19470 74 6f 72 20 73 71 6c 67 65 6e 2c 20 44 62 46 75  tor sqlgen, DbFu
19480 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f 6e  nctionExpression
19490 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20   e)..    {..    
194a0 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73    SqlBuilder res
194b0 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69  ult = new SqlBui
194c0 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 44  lder();..      D
194d0 65 62 75 67 2e 41 73 73 65 72 74 28 65 2e 41 72  ebug.Assert(e.Ar
194e0 67 75 6d 65 6e 74 73 2e 43 6f 75 6e 74 20 3d 3d  guments.Count ==
194f0 20 32 2c 20 22 43 61 6e 6f 6e 69 63 61 6c 20 64   2, "Canonical d
19500 61 74 65 70 61 72 74 20 66 75 6e 63 74 69 6f 6e  atepart function
19510 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 78  s should have ex
19520 61 63 74 6c 79 20 74 77 6f 20 61 72 67 75 6d 65  actly two argume
19530 6e 74 73 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  nts");....      
19540 73 77 69 74 63 68 20 28 73 71 6c 67 65 6e 2e 5f  switch (sqlgen._
19550 6d 61 6e 69 66 65 73 74 2e 5f 64 61 74 65 54 69  manifest._dateTi
19560 6d 65 46 6f 72 6d 61 74 29 0d 0a 20 20 20 20 20  meFormat)..     
19570 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65   {..        case
19580 20 53 51 4c 69 74 65 44 61 74 65 46 6f 72 6d 61   SQLiteDateForma
19590 74 73 2e 54 69 63 6b 73 3a 0d 0a 20 20 20 20 20  ts.Ticks:..     
195a0 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
195b0 6e 64 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  nd(String.Format
195c0 28 22 28 53 54 52 46 54 49 4d 45 28 27 25 73 27  ("(STRFTIME('%s'
195d0 2c 20 4a 55 4c 49 41 4e 44 41 59 28 7b 31 7d 29  , JULIANDAY({1})
195e0 20 2b 20 28 7b 30 7d 20 2f 20 38 36 34 30 30 2e   + ({0} / 86400.
195f0 30 29 29 20 2a 20 31 30 30 30 30 30 30 30 20 2b  0)) * 10000000 +
19600 20 36 32 31 33 35 35 39 36 38 30 30 30 30 30 30   621355968000000
19610 30 30 30 29 22 2c 20 65 2e 41 72 67 75 6d 65 6e  000)", e.Argumen
19620 74 73 5b 30 5d 2e 41 63 63 65 70 74 28 73 71 6c  ts[0].Accept(sql
19630 67 65 6e 29 2c 20 65 2e 41 72 67 75 6d 65 6e 74  gen), e.Argument
19640 73 5b 31 5d 2e 41 63 63 65 70 74 28 73 71 6c 67  s[1].Accept(sqlg
19650 65 6e 29 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  en)));..        
19660 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
19670 20 20 63 61 73 65 20 53 51 4c 69 74 65 44 61 74    case SQLiteDat
19680 65 46 6f 72 6d 61 74 73 2e 4a 75 6c 69 61 6e 44  eFormats.JulianD
19690 61 79 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  ay:..          r
196a0 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 53 74 72  esult.Append(Str
196b0 69 6e 67 2e 46 6f 72 6d 61 74 28 22 43 41 53 54  ing.Format("CAST
196c0 28 53 54 52 46 54 49 4d 45 28 27 25 4a 27 2c 20  (STRFTIME('%J', 
196d0 4a 55 4c 49 41 4e 44 41 59 28 7b 31 7d 29 20 2b  JULIANDAY({1}) +
196e0 20 28 7b 30 7d 20 2f 20 38 36 34 30 30 2e 30 29   ({0} / 86400.0)
196f0 29 20 41 53 20 64 6f 75 62 6c 65 29 22 2c 20 65  ) AS double)", e
19700 2e 41 72 67 75 6d 65 6e 74 73 5b 30 5d 2e 41 63  .Arguments[0].Ac
19710 63 65 70 74 28 73 71 6c 67 65 6e 29 2c 20 65 2e  cept(sqlgen), e.
19720 41 72 67 75 6d 65 6e 74 73 5b 31 5d 2e 41 63 63  Arguments[1].Acc
19730 65 70 74 28 73 71 6c 67 65 6e 29 29 29 3b 0d 0a  ept(sqlgen)));..
19740 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19750 0d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ..        defaul
19760 74 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  t:..          re
19770 73 75 6c 74 2e 41 70 70 65 6e 64 28 53 74 72 69  sult.Append(Stri
19780 6e 67 2e 46 6f 72 6d 61 74 28 22 53 54 52 46 54  ng.Format("STRFT
19790 49 4d 45 28 27 25 59 2d 25 6d 2d 25 64 20 25 48  IME('%Y-%m-%d %H
197a0 3a 25 4d 3a 25 53 27 2c 20 4a 55 4c 49 41 4e 44  :%M:%S', JULIAND
197b0 41 59 28 7b 31 7d 29 20 2b 20 28 7b 30 7d 20 2f  AY({1}) + ({0} /
197c0 20 38 36 34 30 30 2e 30 29 29 22 2c 20 65 2e 41   86400.0))", e.A
197d0 72 67 75 6d 65 6e 74 73 5b 30 5d 2e 41 63 63 65  rguments[0].Acce
197e0 70 74 28 73 71 6c 67 65 6e 29 2c 20 65 2e 41 72  pt(sqlgen), e.Ar
197f0 67 75 6d 65 6e 74 73 5b 31 5d 2e 41 63 63 65 70  guments[1].Accep
19800 74 28 73 71 6c 67 65 6e 29 29 29 3b 0d 0a 20 20  t(sqlgen)));..  
19810 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
19820 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19830 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d   return result;.
19840 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
19850 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
19860 20 2f 2f 2f 20 44 61 74 65 53 75 62 74 72 61 63   /// DateSubtrac
19870 74 28 64 61 74 65 74 69 6d 65 31 2c 20 64 61 74  t(datetime1, dat
19880 65 74 69 6d 65 32 29 20 2d 3e 20 44 41 54 45 44  etime2) -> DATED
19890 49 46 46 20 28 20 73 65 63 6f 6e 64 73 20 2c 20  IFF ( seconds , 
198a0 73 74 61 72 74 64 61 74 65 20 2c 20 65 6e 64 64  startdate , endd
198b0 61 74 65 20 29 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ate )..    /// <
198c0 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
198d0 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
198e0 73 71 6c 67 65 6e 22 3e 3c 2f 70 61 72 61 6d 3e  sqlgen"></param>
198f0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
19900 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61   name="e"></para
19910 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
19920 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d  urns></returns>.
19930 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
19940 74 69 63 20 49 53 71 6c 46 72 61 67 6d 65 6e 74  tic ISqlFragment
19950 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c   HandleCanonical
19960 46 75 6e 63 74 69 6f 6e 44 61 74 65 53 75 62 74  FunctionDateSubt
19970 72 61 63 74 28 53 71 6c 47 65 6e 65 72 61 74 6f  ract(SqlGenerato
19980 72 20 73 71 6c 67 65 6e 2c 20 44 62 46 75 6e 63  r sqlgen, DbFunc
19990 74 69 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20 65  tionExpression e
199a0 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
199b0 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c  SqlBuilder resul
199c0 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64  t = new SqlBuild
199d0 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 44 65 62  er();..      Deb
199e0 75 67 2e 41 73 73 65 72 74 28 65 2e 41 72 67 75  ug.Assert(e.Argu
199f0 6d 65 6e 74 73 2e 43 6f 75 6e 74 20 3d 3d 20 32  ments.Count == 2
19a00 2c 20 22 43 61 6e 6f 6e 69 63 61 6c 20 64 61 74  , "Canonical dat
19a10 65 70 61 72 74 20 66 75 6e 63 74 69 6f 6e 73 20  epart functions 
19a20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 78 61 63  should have exac
19a30 74 6c 79 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  tly two argument
19a40 73 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 73 77  s");....      sw
19a50 69 74 63 68 20 28 73 71 6c 67 65 6e 2e 5f 6d 61  itch (sqlgen._ma
19a60 6e 69 66 65 73 74 2e 5f 64 61 74 65 54 69 6d 65  nifest._dateTime
19a70 46 6f 72 6d 61 74 29 0d 0a 20 20 20 20 20 20 7b  Format)..      {
19a80 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ..        case S
19a90 51 4c 69 74 65 44 61 74 65 46 6f 72 6d 61 74 73  QLiteDateFormats
19aa0 2e 54 69 63 6b 73 3a 0d 0a 20 20 20 20 20 20 20  .Ticks:..       
19ab0 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
19ac0 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
19ad0 43 41 53 54 28 28 28 7b 30 7d 20 2d 20 36 32 31  CAST((({0} - 621
19ae0 33 35 35 39 36 38 30 30 30 30 30 30 30 30 30 29  355968000000000)
19af0 20 2f 20 31 30 30 30 30 30 30 30 2e 30 29 20 20   / 10000000.0)  
19b00 2d 20 28 28 7b 31 7d 20 2d 20 36 32 31 33 35 35  - (({1} - 621355
19b10 39 36 38 30 30 30 30 30 30 30 30 30 29 20 2f 20  968000000000) / 
19b20 31 30 30 30 30 30 30 30 2e 30 29 20 2a 20 38 36  10000000.0) * 86
19b30 34 30 30 2e 30 20 41 53 20 69 6e 74 65 67 65 72  400.0 AS integer
19b40 29 22 2c 20 65 2e 41 72 67 75 6d 65 6e 74 73 5b  )", e.Arguments[
19b50 30 5d 2e 41 63 63 65 70 74 28 73 71 6c 67 65 6e  0].Accept(sqlgen
19b60 29 2c 20 65 2e 41 72 67 75 6d 65 6e 74 73 5b 31  ), e.Arguments[1
19b70 5d 2e 41 63 63 65 70 74 28 73 71 6c 67 65 6e 29  ].Accept(sqlgen)
19b80 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  ));..          b
19b90 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 64  reak;..        d
19ba0 65 66 61 75 6c 74 3a 0d 0a 20 20 20 20 20 20 20  efault:..       
19bb0 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
19bc0 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
19bd0 43 41 53 54 28 28 4a 55 4c 49 41 4e 44 41 59 28  CAST((JULIANDAY(
19be0 7b 31 7d 29 20 2d 20 4a 55 4c 49 41 4e 44 41 59  {1}) - JULIANDAY
19bf0 28 7b 30 7d 29 29 20 2a 20 38 36 34 30 30 2e 30  ({0})) * 86400.0
19c00 20 41 53 20 69 6e 74 65 67 65 72 29 22 2c 20 65   AS integer)", e
19c10 2e 41 72 67 75 6d 65 6e 74 73 5b 30 5d 2e 41 63  .Arguments[0].Ac
19c20 63 65 70 74 28 73 71 6c 67 65 6e 29 2c 20 65 2e  cept(sqlgen), e.
19c30 41 72 67 75 6d 65 6e 74 73 5b 31 5d 2e 41 63 63  Arguments[1].Acc
19c40 65 70 74 28 73 71 6c 67 65 6e 29 29 29 3b 0d 0a  ept(sqlgen)));..
19c50 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19c60 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
19c70 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
19c80 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
19c90 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
19ca0 20 20 20 2f 2f 2f 20 48 61 6e 64 6c 65 72 20 66     /// Handler f
19cb0 6f 72 20 63 61 6e 6f 6e 69 63 61 6c 20 66 75 6e  or canonical fun
19cc0 63 74 69 6f 6e 73 20 66 6f 72 20 65 78 74 72 61  ctions for extra
19cd0 63 74 69 6e 67 20 64 61 74 65 20 70 61 72 74 73  cting date parts
19ce0 2e 0d 0a 20 20 20 20 2f 2f 2f 20 46 6f 72 20 65  ...    /// For e
19cf0 78 61 6d 70 6c 65 3a 0d 0a 20 20 20 20 2f 2f 2f  xample:..    ///
19d00 20 20 20 20 20 59 65 61 72 28 64 61 74 65 29 20       Year(date) 
19d10 2d 3e 20 44 41 54 45 50 41 52 54 28 20 79 65 61  -> DATEPART( yea
19d20 72 2c 20 64 61 74 65 29 0d 0a 20 20 20 20 2f 2f  r, date)..    //
19d30 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
19d40 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
19d50 65 3d 22 73 71 6c 67 65 6e 22 3e 3c 2f 70 61 72  e="sqlgen"></par
19d60 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
19d70 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70  ram name="e"></p
19d80 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
19d90 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e  returns></return
19da0 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  s>..    private 
19db0 73 74 61 74 69 63 20 49 53 71 6c 46 72 61 67 6d  static ISqlFragm
19dc0 65 6e 74 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69  ent HandleCanoni
19dd0 63 61 6c 46 75 6e 63 74 69 6f 6e 44 61 74 65 70  calFunctionDatep
19de0 61 72 74 28 53 71 6c 47 65 6e 65 72 61 74 6f 72  art(SqlGenerator
19df0 20 73 71 6c 67 65 6e 2c 20 44 62 46 75 6e 63 74   sqlgen, DbFunct
19e00 69 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20 65 29  ionExpression e)
19e10 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 73  ..    {..      s
19e20 74 72 69 6e 67 20 74 72 61 6e 73 3b 0d 0a 20 20  tring trans;..  
19e30 20 20 20 20 69 66 20 28 21 5f 64 61 74 65 70 61      if (!_datepa
19e40 72 74 4b 65 79 77 6f 72 64 73 2e 54 72 79 47 65  rtKeywords.TryGe
19e50 74 56 61 6c 75 65 28 65 2e 46 75 6e 63 74 69 6f  tValue(e.Functio
19e60 6e 2e 4e 61 6d 65 2c 20 6f 75 74 20 74 72 61 6e  n.Name, out tran
19e70 73 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  s))..      {..  
19e80 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
19e90 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f 6e  InvalidOperation
19ea0 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67  Exception(String
19eb0 2e 46 6f 72 6d 61 74 28 22 7b 30 7d 27 20 69 73  .Format("{0}' is
19ec0 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 76 61 6c   not a valid val
19ed0 75 65 20 66 6f 72 20 53 54 52 46 54 49 4d 45 20  ue for STRFTIME 
19ee0 61 72 67 75 6d 65 6e 74 22 2c 20 65 2e 46 75 6e  argument", e.Fun
19ef0 63 74 69 6f 6e 2e 4e 61 6d 65 29 29 3b 0d 0a 20  ction.Name));.. 
19f00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19f10 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c  SqlBuilder resul
19f20 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64  t = new SqlBuild
19f30 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 73  er();..      res
19f40 75 6c 74 2e 41 70 70 65 6e 64 28 22 43 41 53 54  ult.Append("CAST
19f50 28 53 54 52 46 54 49 4d 45 28 27 22 29 3b 0d 0a  (STRFTIME('");..
19f60 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
19f70 65 6e 64 28 74 72 61 6e 73 29 3b 0d 0a 20 20 20  end(trans);..   
19f80 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
19f90 28 22 27 2c 20 22 29 3b 0d 0a 0d 0a 20 20 20 20  ("', ");....    
19fa0 20 20 44 65 62 75 67 2e 41 73 73 65 72 74 28 65    Debug.Assert(e
19fb0 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75 6e 74  .Arguments.Count
19fc0 20 3d 3d 20 31 2c 20 22 43 61 6e 6f 6e 69 63 61   == 1, "Canonica
19fd0 6c 20 64 61 74 65 70 61 72 74 20 66 75 6e 63 74  l datepart funct
19fe0 69 6f 6e 73 20 73 68 6f 75 6c 64 20 68 61 76 65  ions should have
19ff0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 61 72 67   exactly one arg
1a000 75 6d 65 6e 74 22 29 3b 0d 0a 0d 0a 20 20 20 20  ument");....    
1a010 20 20 73 77 69 74 63 68 20 28 73 71 6c 67 65 6e    switch (sqlgen
1a020 2e 5f 6d 61 6e 69 66 65 73 74 2e 5f 64 61 74 65  ._manifest._date
1a030 54 69 6d 65 46 6f 72 6d 61 74 29 0d 0a 20 20 20  TimeFormat)..   
1a040 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 61     {..        ca
1a050 73 65 20 53 51 4c 69 74 65 44 61 74 65 46 6f 72  se SQLiteDateFor
1a060 6d 61 74 73 2e 54 69 63 6b 73 3a 0d 0a 20 20 20  mats.Ticks:..   
1a070 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70         result.Ap
1a080 70 65 6e 64 28 53 74 72 69 6e 67 2e 46 6f 72 6d  pend(String.Form
1a090 61 74 28 22 28 28 7b 30 7d 20 2d 20 36 32 31 33  at("(({0} - 6213
1a0a0 35 35 39 36 38 30 30 30 30 30 30 30 30 30 29 20  55968000000000) 
1a0b0 2f 20 31 30 30 30 30 30 30 30 2e 30 29 22 2c 20  / 10000000.0)", 
1a0c0 65 2e 41 72 67 75 6d 65 6e 74 73 5b 30 5d 2e 41  e.Arguments[0].A
1a0d0 63 63 65 70 74 28 73 71 6c 67 65 6e 29 29 29 3b  ccept(sqlgen)));
1a0e0 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ..          brea
1a0f0 6b 3b 0d 0a 20 20 20 20 20 20 20 20 64 65 66 61  k;..        defa
1a100 75 6c 74 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  ult:..          
1a110 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e  result.Append(e.
1a120 41 72 67 75 6d 65 6e 74 73 5b 30 5d 2e 41 63 63  Arguments[0].Acc
1a130 65 70 74 28 73 71 6c 67 65 6e 29 29 3b 0d 0a 20  ept(sqlgen));.. 
1a140 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d           break;.
1a150 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1a160 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
1a170 22 29 20 41 53 20 69 6e 74 65 67 65 72 29 22 29  ") AS integer)")
1a180 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  ;....      retur
1a190 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d  n result;..    }
1a1a0 0d 0a 0d 0a 23 69 66 20 55 53 45 5f 49 4e 54 45  ....#if USE_INTE
1a1b0 52 4f 50 5f 44 4c 4c 20 26 26 20 49 4e 54 45 52  ROP_DLL && INTER
1a1c0 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
1a1d0 43 54 49 4f 4e 53 0d 0a 20 20 20 20 2f 2f 2f 20  CTIONS..    /// 
1a1e0 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
1a1f0 2f 2f 20 20 46 75 6e 63 74 69 6f 6e 20 72 65 6e  //  Function ren
1a200 61 6d 65 20 49 6e 64 65 78 4f 66 20 2d 3e 20 43  ame IndexOf -> C
1a210 48 41 52 49 4e 44 45 58 0d 0a 20 20 20 20 2f 2f  HARINDEX..    //
1a220 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
1a230 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
1a240 65 3d 22 73 71 6c 67 65 6e 22 3e 3c 2f 70 61 72  e="sqlgen"></par
1a250 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
1a260 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70  ram name="e"></p
1a270 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
1a280 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e  returns></return
1a290 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  s>..    private 
1a2a0 73 74 61 74 69 63 20 49 53 71 6c 46 72 61 67 6d  static ISqlFragm
1a2b0 65 6e 74 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69  ent HandleCanoni
1a2c0 63 61 6c 46 75 6e 63 74 69 6f 6e 49 6e 64 65 78  calFunctionIndex
1a2d0 4f 66 28 53 71 6c 47 65 6e 65 72 61 74 6f 72 20  Of(SqlGenerator 
1a2e0 73 71 6c 67 65 6e 2c 20 44 62 46 75 6e 63 74 69  sqlgen, DbFuncti
1a2f0 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d  onExpression e).
1a300 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
1a310 74 75 72 6e 20 73 71 6c 67 65 6e 2e 48 61 6e 64  turn sqlgen.Hand
1a320 6c 65 46 75 6e 63 74 69 6f 6e 44 65 66 61 75 6c  leFunctionDefaul
1a330 74 47 69 76 65 6e 4e 61 6d 65 28 65 2c 20 22 43  tGivenName(e, "C
1a340 48 41 52 49 4e 44 45 58 22 29 3b 0d 0a 20 20 20  HARINDEX");..   
1a350 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20   }..#endif....  
1a360 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
1a370 0a 20 20 20 20 2f 2f 2f 20 20 46 75 6e 63 74 69  .    ///  Functi
1a380 6f 6e 20 72 65 6e 61 6d 65 20 4e 65 77 47 75 69  on rename NewGui
1a390 64 20 2d 3e 20 4e 45 57 49 44 0d 0a 20 20 20 20  d -> NEWID..    
1a3a0 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
1a3b0 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
1a3c0 61 6d 65 3d 22 73 71 6c 67 65 6e 22 3e 3c 2f 70  ame="sqlgen"></p
1a3d0 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
1a3e0 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c  param name="e"><
1a3f0 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
1a400 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75   <returns></retu
1a410 72 6e 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74  rns>..    privat
1a420 65 20 73 74 61 74 69 63 20 49 53 71 6c 46 72 61  e static ISqlFra
1a430 67 6d 65 6e 74 20 48 61 6e 64 6c 65 43 61 6e 6f  gment HandleCano
1a440 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e 4e 65 77  nicalFunctionNew
1a450 47 75 69 64 28 53 71 6c 47 65 6e 65 72 61 74 6f  Guid(SqlGenerato
1a460 72 20 73 71 6c 67 65 6e 2c 20 44 62 46 75 6e 63  r sqlgen, DbFunc
1a470 74 69 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20 65  tionExpression e
1a480 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
1a490 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c  SqlBuilder resul
1a4a0 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69 6c 64  t = new SqlBuild
1a4b0 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 73  er();..      res
1a4c0 75 6c 74 2e 41 70 70 65 6e 64 28 22 52 41 4e 44  ult.Append("RAND
1a4d0 4f 4d 42 4c 4f 42 28 31 36 29 22 29 3b 0d 0a 20  OMBLOB(16)");.. 
1a4e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75       return resu
1a4f0 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  lt;..    }....  
1a500 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
1a510 0a 20 20 20 20 2f 2f 2f 20 20 4c 65 6e 67 74 68  .    ///  Length
1a520 28 61 72 67 29 20 2d 3e 20 4c 45 4e 28 61 72 67  (arg) -> LEN(arg
1a530 20 2b 20 27 2e 27 29 20 2d 20 4c 45 4e 28 27 2e   + '.') - LEN('.
1a540 27 29 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ')..    /// </su
1a550 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
1a560 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 71 6c  <param name="sql
1a570 67 65 6e 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  gen"></param>.. 
1a580 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
1a590 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  me="e"></param>.
1a5a0 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
1a5b0 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  s></returns>..  
1a5c0 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
1a5d0 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 48 61   ISqlFragment Ha
1a5e0 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e  ndleCanonicalFun
1a5f0 63 74 69 6f 6e 4c 65 6e 67 74 68 28 53 71 6c 47  ctionLength(SqlG
1a600 65 6e 65 72 61 74 6f 72 20 73 71 6c 67 65 6e 2c  enerator sqlgen,
1a610 20 44 62 46 75 6e 63 74 69 6f 6e 45 78 70 72 65   DbFunctionExpre
1a620 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d  ssion e)..    {.
1a630 0a 20 20 20 20 20 20 53 71 6c 42 75 69 6c 64 65  .      SqlBuilde
1a640 72 20 72 65 73 75 6c 74 20 3d 20 6e 65 77 20 53  r result = new S
1a650 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d 0a 0d 0a  qlBuilder();....
1a660 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
1a670 65 6e 64 28 22 4c 45 4e 47 54 48 28 22 29 3b 0d  end("LENGTH(");.
1a680 0a 0d 0a 20 20 20 20 20 20 44 65 62 75 67 2e 41  ...      Debug.A
1a690 73 73 65 72 74 28 65 2e 41 72 67 75 6d 65 6e 74  ssert(e.Argument
1a6a0 73 2e 43 6f 75 6e 74 20 3d 3d 20 31 2c 20 22 4c  s.Count == 1, "L
1a6b0 65 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6f  en should have o
1a6c0 6e 65 20 61 72 67 75 6d 65 6e 74 22 29 3b 0d 0a  ne argument");..
1a6d0 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
1a6e0 65 6e 64 28 65 2e 41 72 67 75 6d 65 6e 74 73 5b  end(e.Arguments[
1a6f0 30 5d 2e 41 63 63 65 70 74 28 73 71 6c 67 65 6e  0].Accept(sqlgen
1a700 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73  ));....      res
1a710 75 6c 74 2e 41 70 70 65 6e 64 28 22 29 22 29 3b  ult.Append(")");
1a720 0d 0a 20 20 20 20 20 20 2f 2f 72 65 73 75 6c 74  ..      //result
1a730 2e 41 70 70 65 6e 64 28 22 20 2b 20 27 2e 27 29  .Append(" + '.')
1a740 20 2d 20 4c 45 4e 28 27 2e 27 29 22 29 3b 0d 0a   - LEN('.')");..
1a750 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ..      return r
1a760 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  esult;..    }...
1a770 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
1a780 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 52 6f 75 6e  y>..    /// Roun
1a790 64 28 6e 75 6d 65 72 69 63 45 78 70 72 65 73 73  d(numericExpress
1a7a0 69 6f 6e 29 20 2d 3e 20 52 6f 75 6e 64 28 6e 75  ion) -> Round(nu
1a7b0 6d 65 72 69 63 45 78 70 72 65 73 73 69 6f 6e 2c  mericExpression,
1a7c0 20 30 29 3b 0d 0a 20 20 20 20 2f 2f 2f 20 52 6f   0);..    /// Ro
1a7d0 75 6e 64 28 6e 75 6d 65 72 69 63 45 78 70 72 65  und(numericExpre
1a7e0 73 73 69 6f 6e 2c 20 4e 29 20 2d 3e 20 52 6f 75  ssion, N) -> Rou
1a7f0 6e 64 28 6e 75 6d 65 72 69 63 45 78 70 72 65 73  nd(numericExpres
1a800 73 69 6f 6e 2c 20 4e 29 3b 0d 0a 20 20 20 20 2f  sion, N);..    /
1a810 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
1a820 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
1a830 6d 65 3d 22 73 71 6c 67 65 6e 22 3e 3c 2f 70 61  me="sqlgen"></pa
1a840 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
1a850 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f  aram name="e"></
1a860 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
1a870 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72  <returns></retur
1a880 6e 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65  ns>..    private
1a890 20 73 74 61 74 69 63 20 49 53 71 6c 46 72 61 67   static ISqlFrag
1a8a0 6d 65 6e 74 20 48 61 6e 64 6c 65 43 61 6e 6f 6e  ment HandleCanon
1a8b0 69 63 61 6c 46 75 6e 63 74 69 6f 6e 52 6f 75 6e  icalFunctionRoun
1a8c0 64 28 53 71 6c 47 65 6e 65 72 61 74 6f 72 20 73  d(SqlGenerator s
1a8d0 71 6c 67 65 6e 2c 20 44 62 46 75 6e 63 74 69 6f  qlgen, DbFunctio
1a8e0 6e 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a  nExpression e)..
1a8f0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 71 6c      {..      Sql
1a900 42 75 69 6c 64 65 72 20 72 65 73 75 6c 74 20 3d  Builder result =
1a910 20 6e 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28   new SqlBuilder(
1a920 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 75  );....      resu
1a930 6c 74 2e 41 70 70 65 6e 64 28 22 52 4f 55 4e 44  lt.Append("ROUND
1a940 28 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 44 65  (");....      De
1a950 62 75 67 2e 41 73 73 65 72 74 28 65 2e 41 72 67  bug.Assert(e.Arg
1a960 75 6d 65 6e 74 73 2e 43 6f 75 6e 74 20 3d 3d 20  uments.Count == 
1a970 31 20 7c 7c 20 65 2e 41 72 67 75 6d 65 6e 74 73  1 || e.Arguments
1a980 2e 43 6f 75 6e 74 20 3d 3d 20 32 2c 20 22 52 6f  .Count == 2, "Ro
1a990 75 6e 64 20 73 68 6f 75 6c 64 20 68 61 76 65 20  und should have 
1a9a0 6f 6e 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d  one or two argum
1a9b0 65 6e 74 73 22 29 3b 0d 0a 20 20 20 20 20 20 72  ents");..      r
1a9c0 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 65 2e 41  esult.Append(e.A
1a9d0 72 67 75 6d 65 6e 74 73 5b 30 5d 2e 41 63 63 65  rguments[0].Acce
1a9e0 70 74 28 73 71 6c 67 65 6e 29 29 3b 0d 0a 0d 0a  pt(sqlgen));....
1a9f0 20 20 20 20 20 20 69 66 20 28 65 2e 41 72 67 75        if (e.Argu
1aa00 6d 65 6e 74 73 2e 43 6f 75 6e 74 20 3d 3d 20 32  ments.Count == 2
1aa10 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
1aa20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e      result.Appen
1aa30 64 28 22 2c 20 22 29 3b 0d 0a 20 20 20 20 20 20  d(", ");..      
1aa40 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
1aa50 65 2e 41 72 67 75 6d 65 6e 74 73 5b 31 5d 2e 41  e.Arguments[1].A
1aa60 63 63 65 70 74 28 73 71 6c 67 65 6e 29 29 3b 0d  ccept(sqlgen));.
1aa70 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e  .        result.
1aa80 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a 20 20  Append(")");..  
1aa90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73      }..      els
1aaa0 65 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  e..      {..    
1aab0 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e      result.Appen
1aac0 64 28 22 2c 20 30 29 22 29 3b 0d 0a 20 20 20 20  d(", 0)");..    
1aad0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
1aae0 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20  urn result;..   
1aaf0 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
1ab00 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
1ab10 20 54 52 49 4d 28 73 74 72 69 6e 67 29 20 2d 3e   TRIM(string) ->
1ab20 20 4c 54 52 49 4d 28 52 54 52 49 4d 28 73 74 72   LTRIM(RTRIM(str
1ab30 69 6e 67 29 29 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ing))..    /// <
1ab40 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
1ab50 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
1ab60 73 71 6c 67 65 6e 22 3e 3c 2f 70 61 72 61 6d 3e  sqlgen"></param>
1ab70 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
1ab80 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61   name="e"></para
1ab90 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
1aba0 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d  urns></returns>.
1abb0 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
1abc0 74 69 63 20 49 53 71 6c 46 72 61 67 6d 65 6e 74  tic ISqlFragment
1abd0 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c   HandleCanonical
1abe0 46 75 6e 63 74 69 6f 6e 54 72 69 6d 28 53 71 6c  FunctionTrim(Sql
1abf0 47 65 6e 65 72 61 74 6f 72 20 73 71 6c 67 65 6e  Generator sqlgen
1ac00 2c 20 44 62 46 75 6e 63 74 69 6f 6e 45 78 70 72  , DbFunctionExpr
1ac10 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b  ession e)..    {
1ac20 0d 0a 20 20 20 20 20 20 53 71 6c 42 75 69 6c 64  ..      SqlBuild
1ac30 65 72 20 72 65 73 75 6c 74 20 3d 20 6e 65 77 20  er result = new 
1ac40 53 71 6c 42 75 69 6c 64 65 72 28 29 3b 0d 0a 0d  SqlBuilder();...
1ac50 0a 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70  .      result.Ap
1ac60 70 65 6e 64 28 22 54 52 49 4d 28 22 29 3b 0d 0a  pend("TRIM(");..
1ac70 0d 0a 20 20 20 20 20 20 44 65 62 75 67 2e 41 73  ..      Debug.As
1ac80 73 65 72 74 28 65 2e 41 72 67 75 6d 65 6e 74 73  sert(e.Arguments
1ac90 2e 43 6f 75 6e 74 20 3d 3d 20 31 2c 20 22 54 72  .Count == 1, "Tr
1aca0 69 6d 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6f  im should have o
1acb0 6e 65 20 61 72 67 75 6d 65 6e 74 22 29 3b 0d 0a  ne argument");..
1acc0 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
1acd0 65 6e 64 28 65 2e 41 72 67 75 6d 65 6e 74 73 5b  end(e.Arguments[
1ace0 30 5d 2e 41 63 63 65 70 74 28 73 71 6c 67 65 6e  0].Accept(sqlgen
1acf0 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73  ));....      res
1ad00 75 6c 74 2e 41 70 70 65 6e 64 28 22 29 22 29 3b  ult.Append(")");
1ad10 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
1ad20 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d   result;..    }.
1ad30 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
1ad40 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4c 45  ary>..    /// LE
1ad50 46 54 28 73 74 72 69 6e 67 2c 20 6c 65 6e 67 74  FT(string, lengt
1ad60 68 29 20 2d 3e 20 53 55 42 53 54 52 28 73 74 72  h) -> SUBSTR(str
1ad70 69 6e 67 2c 20 31 2c 20 6c 65 6e 67 74 68 29 0d  ing, 1, length).
1ad80 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
1ad90 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
1ada0 72 61 6d 20 6e 61 6d 65 3d 22 73 71 6c 67 65 6e  ram name="sqlgen
1adb0 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  "></param>..    
1adc0 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1add0 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  "e"></param>..  
1ade0 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c    /// <returns><
1adf0 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70  /returns>..    p
1ae00 72 69 76 61 74 65 20 73 74 61 74 69 63 20 49 53  rivate static IS
1ae10 71 6c 46 72 61 67 6d 65 6e 74 20 48 61 6e 64 6c  qlFragment Handl
1ae20 65 43 61 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69  eCanonicalFuncti
1ae30 6f 6e 4c 65 66 74 28 53 71 6c 47 65 6e 65 72 61  onLeft(SqlGenera
1ae40 74 6f 72 20 73 71 6c 67 65 6e 2c 20 44 62 46 75  tor sqlgen, DbFu
1ae50 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f 6e  nctionExpression
1ae60 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20   e)..    {..    
1ae70 20 20 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72      SqlBuilder r
1ae80 65 73 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42  esult = new SqlB
1ae90 75 69 6c 64 65 72 28 29 3b 0d 0a 0d 0a 20 20 20  uilder();....   
1aea0 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
1aeb0 6e 64 28 22 53 55 42 53 54 52 28 22 29 3b 0d 0a  nd("SUBSTR(");..
1aec0 0d 0a 20 20 20 20 20 20 20 20 44 65 62 75 67 2e  ..        Debug.
1aed0 41 73 73 65 72 74 28 65 2e 41 72 67 75 6d 65 6e  Assert(e.Argumen
1aee0 74 73 2e 43 6f 75 6e 74 20 3d 3d 20 32 2c 20 22  ts.Count == 2, "
1aef0 4c 65 66 74 20 73 68 6f 75 6c 64 20 68 61 76 65  Left should have
1af00 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 22 29   two arguments")
1af10 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  ;..        resul
1af20 74 2e 41 70 70 65 6e 64 28 65 2e 41 72 67 75 6d  t.Append(e.Argum
1af30 65 6e 74 73 5b 30 5d 2e 41 63 63 65 70 74 28 73  ents[0].Accept(s
1af40 71 6c 67 65 6e 29 29 3b 0d 0a 20 20 20 20 20 20  qlgen));..      
1af50 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
1af60 22 2c 20 31 2c 20 22 29 3b 0d 0a 20 20 20 20 20  ", 1, ");..     
1af70 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
1af80 28 65 2e 41 72 67 75 6d 65 6e 74 73 5b 31 5d 2e  (e.Arguments[1].
1af90 41 63 63 65 70 74 28 73 71 6c 67 65 6e 29 29 3b  Accept(sqlgen));
1afa0 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  ..        result
1afb0 2e 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a 0d  .Append(")");...
1afc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1afd0 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a  result;..    }..
1afe0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
1aff0 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 52 49 47  ry>..    /// RIG
1b000 48 54 28 73 74 72 69 6e 67 2c 20 6c 65 6e 67 74  HT(string, lengt
1b010 68 29 20 2d 3e 20 53 55 42 53 54 52 28 73 74 72  h) -> SUBSTR(str
1b020 69 6e 67 2c 20 2d 28 6c 65 6e 67 74 68 29 2c 20  ing, -(length), 
1b030 6c 65 6e 67 74 68 29 0d 0a 20 20 20 20 2f 2f 2f  length)..    ///
1b040 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
1b050 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
1b060 3d 22 73 71 6c 67 65 6e 22 3e 3c 2f 70 61 72 61  ="sqlgen"></para
1b070 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
1b080 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61  am name="e"></pa
1b090 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
1b0a0 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73  eturns></returns
1b0b0 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  >..    private s
1b0c0 74 61 74 69 63 20 49 53 71 6c 46 72 61 67 6d 65  tatic ISqlFragme
1b0d0 6e 74 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69 63  nt HandleCanonic
1b0e0 61 6c 46 75 6e 63 74 69 6f 6e 52 69 67 68 74 28  alFunctionRight(
1b0f0 53 71 6c 47 65 6e 65 72 61 74 6f 72 20 73 71 6c  SqlGenerator sql
1b100 67 65 6e 2c 20 44 62 46 75 6e 63 74 69 6f 6e 45  gen, DbFunctionE
1b110 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20  xpression e)..  
1b120 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 53 71 6c    {..        Sql
1b130 42 75 69 6c 64 65 72 20 72 65 73 75 6c 74 20 3d  Builder result =
1b140 20 6e 65 77 20 53 71 6c 42 75 69 6c 64 65 72 28   new SqlBuilder(
1b150 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65  );....        re
1b160 73 75 6c 74 2e 41 70 70 65 6e 64 28 22 53 55 42  sult.Append("SUB
1b170 53 54 52 28 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  STR(");....     
1b180 20 20 20 44 65 62 75 67 2e 41 73 73 65 72 74 28     Debug.Assert(
1b190 65 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75 6e  e.Arguments.Coun
1b1a0 74 20 3d 3d 20 32 2c 20 22 52 69 67 68 74 20 73  t == 2, "Right s
1b1b0 68 6f 75 6c 64 20 68 61 76 65 20 74 77 6f 20 61  hould have two a
1b1c0 72 67 75 6d 65 6e 74 73 22 29 3b 0d 0a 20 20 20  rguments");..   
1b1d0 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
1b1e0 6e 64 28 65 2e 41 72 67 75 6d 65 6e 74 73 5b 30  nd(e.Arguments[0
1b1f0 5d 2e 41 63 63 65 70 74 28 73 71 6c 67 65 6e 29  ].Accept(sqlgen)
1b200 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75  );..        resu
1b210 6c 74 2e 41 70 70 65 6e 64 28 22 2c 20 2d 28 22  lt.Append(", -("
1b220 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75  );..        resu
1b230 6c 74 2e 41 70 70 65 6e 64 28 65 2e 41 72 67 75  lt.Append(e.Argu
1b240 6d 65 6e 74 73 5b 31 5d 2e 41 63 63 65 70 74 28  ments[1].Accept(
1b250 73 71 6c 67 65 6e 29 29 3b 0d 0a 20 20 20 20 20  sqlgen));..     
1b260 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
1b270 28 22 29 2c 20 22 29 3b 0d 0a 20 20 20 20 20 20  ("), ");..      
1b280 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28    result.Append(
1b290 65 2e 41 72 67 75 6d 65 6e 74 73 5b 31 5d 2e 41  e.Arguments[1].A
1b2a0 63 63 65 70 74 28 73 71 6c 67 65 6e 29 29 3b 0d  ccept(sqlgen));.
1b2b0 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e  .        result.
1b2c0 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a 0d 0a  Append(")");....
1b2d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b2e0 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  esult;..    }...
1b2f0 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
1b300 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 53 55 42 53  y>..    /// SUBS
1b310 54 52 49 4e 47 28 73 74 72 69 6e 67 2c 20 73 74  TRING(string, st
1b320 61 72 74 29 20 2d 3e 20 53 55 42 53 54 52 28 73  art) -> SUBSTR(s
1b330 74 72 69 6e 67 2c 20 73 74 61 72 74 29 0d 0a 20  tring, start).. 
1b340 20 20 20 2f 2f 2f 20 53 55 42 53 54 52 49 4e 47     /// SUBSTRING
1b350 28 73 74 72 69 6e 67 2c 20 73 74 61 72 74 2c 20  (string, start, 
1b360 6c 65 6e 67 74 68 29 20 2d 3e 20 53 55 42 53 54  length) -> SUBST
1b370 52 28 73 74 72 69 6e 67 2c 20 73 74 61 72 74 2c  R(string, start,
1b380 20 6c 65 6e 67 74 68 29 0d 0a 20 20 20 20 2f 2f   length)..    //
1b390 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
1b3a0 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
1b3b0 65 3d 22 73 71 6c 67 65 6e 22 3e 3c 2f 70 61 72  e="sqlgen"></par
1b3c0 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
1b3d0 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70  ram name="e"></p
1b3e0 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
1b3f0 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e  returns></return
1b400 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  s>..    private 
1b410 73 74 61 74 69 63 20 49 53 71 6c 46 72 61 67 6d  static ISqlFragm
1b420 65 6e 74 20 48 61 6e 64 6c 65 43 61 6e 6f 6e 69  ent HandleCanoni
1b430 63 61 6c 46 75 6e 63 74 69 6f 6e 53 75 62 73 74  calFunctionSubst
1b440 72 69 6e 67 28 53 71 6c 47 65 6e 65 72 61 74 6f  ring(SqlGenerato
1b450 72 20 73 71 6c 67 65 6e 2c 20 44 62 46 75 6e 63  r sqlgen, DbFunc
1b460 74 69 6f 6e 45 78 70 72 65 73 73 69 6f 6e 20 65  tionExpression e
1b470 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
1b480 20 20 53 71 6c 42 75 69 6c 64 65 72 20 72 65 73    SqlBuilder res
1b490 75 6c 74 20 3d 20 6e 65 77 20 53 71 6c 42 75 69  ult = new SqlBui
1b4a0 6c 64 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  lder();....     
1b4b0 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
1b4c0 28 22 53 55 42 53 54 52 28 22 29 3b 0d 0a 0d 0a  ("SUBSTR(");....
1b4d0 20 20 20 20 20 20 20 20 44 65 62 75 67 2e 41 73          Debug.As
1b4e0 73 65 72 74 28 65 2e 41 72 67 75 6d 65 6e 74 73  sert(e.Arguments
1b4f0 2e 43 6f 75 6e 74 20 3d 3d 20 32 20 7c 7c 20 65  .Count == 2 || e
1b500 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75 6e 74  .Arguments.Count
1b510 20 3d 3d 20 33 2c 20 22 53 75 62 73 74 72 69 6e   == 3, "Substrin
1b520 67 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 77  g should have tw
1b530 6f 20 6f 72 20 74 68 72 65 65 20 61 72 67 75 6d  o or three argum
1b540 65 6e 74 73 22 29 3b 0d 0a 20 20 20 20 20 20 20  ents");..       
1b550 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 65   result.Append(e
1b560 2e 41 72 67 75 6d 65 6e 74 73 5b 30 5d 2e 41 63  .Arguments[0].Ac
1b570 63 65 70 74 28 73 71 6c 67 65 6e 29 29 3b 0d 0a  cept(sqlgen));..
1b580 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41          result.A
1b590 70 70 65 6e 64 28 22 2c 20 22 29 3b 0d 0a 20 20  ppend(", ");..  
1b5a0 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
1b5b0 65 6e 64 28 65 2e 41 72 67 75 6d 65 6e 74 73 5b  end(e.Arguments[
1b5c0 31 5d 2e 41 63 63 65 70 74 28 73 71 6c 67 65 6e  1].Accept(sqlgen
1b5d0 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ));....        i
1b5e0 66 20 28 65 2e 41 72 67 75 6d 65 6e 74 73 2e 43  f (e.Arguments.C
1b5f0 6f 75 6e 74 20 3d 3d 20 33 29 0d 0a 20 20 20 20  ount == 3)..    
1b600 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1b610 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65 6e 64     result.Append
1b620 28 22 2c 20 22 29 3b 0d 0a 20 20 20 20 20 20 20  (", ");..       
1b630 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
1b640 6e 64 28 65 2e 41 72 67 75 6d 65 6e 74 73 5b 32  nd(e.Arguments[2
1b650 5d 2e 41 63 63 65 70 74 28 73 71 6c 67 65 6e 29  ].Accept(sqlgen)
1b660 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  );..        }...
1b670 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e  .        result.
1b680 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a 0d 0a  Append(")");....
1b690 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b6a0 65 73 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  esult;..    }...
1b6b0 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
1b6c0 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 20 46 75 6e  y>..    ///  Fun
1b6d0 63 74 69 6f 6e 20 72 65 6e 61 6d 65 20 54 6f 4c  ction rename ToL
1b6e0 6f 77 65 72 20 2d 3e 20 4c 4f 57 45 52 0d 0a 20  ower -> LOWER.. 
1b6f0 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
1b700 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
1b710 6d 20 6e 61 6d 65 3d 22 73 71 6c 67 65 6e 22 3e  m name="sqlgen">
1b720 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
1b730 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65  / <param name="e
1b740 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  "></param>..    
1b750 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72  /// <returns></r
1b760 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 72 69  eturns>..    pri
1b770 76 61 74 65 20 73 74 61 74 69 63 20 49 53 71 6c  vate static ISql
1b780 46 72 61 67 6d 65 6e 74 20 48 61 6e 64 6c 65 43  Fragment HandleC
1b790 61 6e 6f 6e 69 63 61 6c 46 75 6e 63 74 69 6f 6e  anonicalFunction
1b7a0 54 6f 4c 6f 77 65 72 28 53 71 6c 47 65 6e 65 72  ToLower(SqlGener
1b7b0 61 74 6f 72 20 73 71 6c 67 65 6e 2c 20 44 62 46  ator sqlgen, DbF
1b7c0 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f  unctionExpressio
1b7d0 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n e)..    {..   
1b7e0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 67 65 6e     return sqlgen
1b7f0 2e 48 61 6e 64 6c 65 46 75 6e 63 74 69 6f 6e 44  .HandleFunctionD
1b800 65 66 61 75 6c 74 47 69 76 65 6e 4e 61 6d 65 28  efaultGivenName(
1b810 65 2c 20 22 4c 4f 57 45 52 22 29 3b 0d 0a 20 20  e, "LOWER");..  
1b820 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
1b830 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
1b840 2f 20 20 46 75 6e 63 74 69 6f 6e 20 72 65 6e 61  /  Function rena
1b850 6d 65 20 54 6f 55 70 70 65 72 20 2d 3e 20 55 50  me ToUpper -> UP
1b860 50 45 52 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  PER..    /// </s
1b870 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
1b880 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 71   <param name="sq
1b890 6c 67 65 6e 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  lgen"></param>..
1b8a0 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
1b8b0 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e  ame="e"></param>
1b8c0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72  ..    /// <retur
1b8d0 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  ns></returns>.. 
1b8e0 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
1b8f0 63 20 49 53 71 6c 46 72 61 67 6d 65 6e 74 20 48  c ISqlFragment H
1b900 61 6e 64 6c 65 43 61 6e 6f 6e 69 63 61 6c 46 75  andleCanonicalFu
1b910 6e 63 74 69 6f 6e 54 6f 55 70 70 65 72 28 53 71  nctionToUpper(Sq
1b920 6c 47 65 6e 65 72 61 74 6f 72 20 73 71 6c 67 65  lGenerator sqlge
1b930 6e 2c 20 44 62 46 75 6e 63 74 69 6f 6e 45 78 70  n, DbFunctionExp
1b940 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ression e)..    
1b950 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
1b960 73 71 6c 67 65 6e 2e 48 61 6e 64 6c 65 46 75 6e  sqlgen.HandleFun
1b970 63 74 69 6f 6e 44 65 66 61 75 6c 74 47 69 76 65  ctionDefaultGive
1b980 6e 4e 61 6d 65 28 65 2c 20 22 55 50 50 45 52 22  nName(e, "UPPER"
1b990 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
1b9a0 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 0d   #endregion.....
1b9b0 0a 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d  .    #endregion.
1b9c0 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f 6e 20 48  ...    #region H
1b9d0 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 66 6f  elper methods fo
1b9e0 72 20 74 68 65 20 44 62 45 78 70 72 65 73 73 69  r the DbExpressi
1b9f0 6f 6e 56 69 73 69 74 6f 72 0d 0a 20 20 20 20 2f  onVisitor..    /
1ba00 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
1ba10 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
1ba20 22 41 64 64 44 65 66 61 75 6c 74 43 6f 6c 75 6d  "AddDefaultColum
1ba30 6e 73 22 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41  ns"/>..    /// A
1ba40 64 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  dd the column na
1ba50 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 72 65 66  mes from the ref
1ba60 65 72 65 6e 63 65 64 20 65 78 74 65 6e 74 2f 6a  erenced extent/j
1ba70 6f 69 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  oin to the..    
1ba80 2f 2f 2f 20 73 65 6c 65 63 74 20 73 74 61 74 65  /// select state
1ba90 6d 65 6e 74 2e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a  ment...    ///..
1baa0 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 73      /// If the s
1bab0 79 6d 62 6f 6c 20 69 73 20 61 20 4a 6f 69 6e 53  ymbol is a JoinS
1bac0 79 6d 62 6f 6c 2c 20 77 65 20 72 65 63 75 72 73  ymbol, we recurs
1bad0 69 76 65 6c 79 20 76 69 73 69 74 20 61 6c 6c 20  ively visit all 
1bae0 74 68 65 20 65 78 74 65 6e 74 73 2c 0d 0a 20 20  the extents,..  
1baf0 20 20 2f 2f 2f 20 68 61 6c 74 69 6e 67 20 61 74    /// halting at
1bb00 20 72 65 61 6c 20 65 78 74 65 6e 74 73 20 61 6e   real extents an
1bb10 64 20 4a 6f 69 6e 53 79 6d 62 6f 6c 73 20 74 68  d JoinSymbols th
1bb20 61 74 20 68 61 76 65 20 61 6e 20 61 73 73 6f 63  at have an assoc
1bb30 69 61 74 65 64 20 53 71 6c 53 65 6c 65 63 74 53  iated SqlSelectS
1bb40 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 2f  tatement...    /
1bb50 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  //..    /// The 
1bb60 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
1bb70 20 61 20 72 65 61 6c 20 65 78 74 65 6e 74 20 63   a real extent c
1bb80 61 6e 20 62 65 20 64 65 72 69 76 65 64 20 66 72  an be derived fr
1bb90 6f 6d 20 69 74 73 20 74 79 70 65 2e 0d 0a 20 20  om its type...  
1bba0 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 75 6d 6e    /// The column
1bbb0 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 4a 6f 69   names for a Joi
1bbc0 6e 20 53 65 6c 65 63 74 20 73 74 61 74 65 6d 65  n Select stateme
1bbd0 6e 74 20 63 61 6e 20 62 65 20 67 6f 74 20 66 72  nt can be got fr
1bbe0 6f 6d 20 74 68 65 0d 0a 20 20 20 20 2f 2f 2f 20  om the..    /// 
1bbf0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
1bc00 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
1bc10 20 77 68 65 6e 20 74 68 65 20 4a 6f 69 6e 27 73   when the Join's
1bc20 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1bc30 74 0d 0a 20 20 20 20 2f 2f 2f 20 77 61 73 20 63  t..    /// was c
1bc40 72 65 61 74 65 64 2e 0d 0a 20 20 20 20 2f 2f 2f  reated...    ///
1bc50 0d 0a 20 20 20 20 2f 2f 2f 20 57 65 20 64 6f 20  ..    /// We do 
1bc60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
1bc70 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0d 0a  r each column...
1bc80 20 20 20 20 2f 2f 2f 20 3c 6c 69 73 74 20 74 79      /// <list ty
1bc90 70 65 3d 22 6e 75 6d 62 65 72 22 3e 0d 0a 20 20  pe="number">..  
1bca0 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 41 64 64 20    /// <item>Add 
1bcb0 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66  the SQL string f
1bcc0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74  or each column t
1bcd0 6f 20 74 68 65 20 53 45 4c 45 43 54 20 63 6c 61  o the SELECT cla
1bce0 75 73 65 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20  use</item>..    
1bcf0 2f 2f 2f 20 3c 69 74 65 6d 3e 41 64 64 20 74 68  /// <item>Add th
1bd00 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  e column to the 
1bd10 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
1bd20 2d 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  - so that it can
1bd30 0d 0a 20 20 20 20 2f 2f 2f 20 62 65 63 6f 6d 65  ..    /// become
1bd40 20 70 61 72 74 20 6f 66 20 74 68 65 20 22 74 79   part of the "ty
1bd50 70 65 22 20 6f 66 20 61 20 4a 6f 69 6e 53 79 6d  pe" of a JoinSym
1bd60 62 6f 6c 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20  bol</item>..    
1bd70 2f 2f 2f 20 3c 69 74 65 6d 3e 43 68 65 63 6b 20  /// <item>Check 
1bd80 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  if the column na
1bd90 6d 65 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  me collides with
1bda0 20 61 20 70 72 65 76 69 6f 75 73 20 63 6f 6c 75   a previous colu
1bdb0 6d 6e 20 61 64 64 65 64 0d 0a 20 20 20 20 2f 2f  mn added..    //
1bdc0 2f 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  / to the same se
1bdd0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  lect statement. 
1bde0 20 46 6c 61 67 20 62 6f 74 68 20 74 68 65 20 63   Flag both the c
1bdf0 6f 6c 75 6d 6e 73 20 66 6f 72 20 72 65 6e 61 6d  olumns for renam
1be00 69 6e 67 20 69 66 20 74 72 75 65 2e 3c 2f 69 74  ing if true.</it
1be10 65 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 69 74  em>..    /// <it
1be20 65 6d 3e 41 64 64 20 74 68 65 20 63 6f 6c 75 6d  em>Add the colum
1be30 6e 20 74 6f 20 61 20 6e 61 6d 65 20 6c 6f 6f 6b  n to a name look
1be40 75 70 20 64 69 63 74 69 6f 6e 61 72 79 20 66 6f  up dictionary fo
1be50 72 20 63 6f 6c 6c 69 73 69 6f 6e 20 64 65 74 65  r collision dete
1be60 63 74 69 6f 6e 2e 3c 2f 69 74 65 6d 3e 0d 0a 20  ction.</item>.. 
1be70 20 20 20 2f 2f 2f 20 3c 2f 6c 69 73 74 3e 0d 0a     /// </list>..
1be80 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
1be90 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  y>..    /// <par
1bea0 61 6d 20 6e 61 6d 65 3d 22 73 65 6c 65 63 74 53  am name="selectS
1beb0 74 61 74 65 6d 65 6e 74 22 3e 54 68 65 20 73 65  tatement">The se
1bec0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 74  lect statement t
1bed0 68 61 74 20 73 74 61 72 74 65 64 20 6f 66 66 20  hat started off 
1bee0 61 73 20 53 45 4c 45 43 54 20 2a 3c 2f 70 61 72  as SELECT *</par
1bef0 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
1bf00 72 61 6d 20 6e 61 6d 65 3d 22 73 79 6d 62 6f 6c  ram name="symbol
1bf10 22 3e 54 68 65 20 73 79 6d 62 6f 6c 20 63 6f 6e  ">The symbol con
1bf20 74 61 69 6e 69 6e 67 20 74 68 65 20 74 79 70 65  taining the type
1bf30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
1bf40 0d 0a 20 20 20 20 2f 2f 2f 20 74 68 65 20 63 6f  ..    /// the co
1bf50 6c 75 6d 6e 73 20 74 6f 20 62 65 20 61 64 64 65  lumns to be adde
1bf60 64 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  d.</param>..    
1bf70 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1bf80 22 63 6f 6c 75 6d 6e 4c 69 73 74 22 3e 43 6f 6c  "columnList">Col
1bf90 75 6d 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  umns that have b
1bfa0 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  een added to the
1bfb0 20 53 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   Select statemen
1bfc0 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73  t...    /// This
1bfd0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 3c   is created in <
1bfe0 73 65 65 20 63 72 65 66 3d 22 41 64 64 44 65 66  see cref="AddDef
1bff0 61 75 6c 74 43 6f 6c 75 6d 6e 73 22 2f 3e 2e 3c  aultColumns"/>.<
1c000 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
1c010 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f   <param name="co
1c020 6c 75 6d 6e 44 69 63 74 69 6f 6e 61 72 79 22 3e  lumnDictionary">
1c030 41 20 64 69 63 74 69 6f 6e 61 72 79 20 6f 66 20  A dictionary of 
1c040 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 62 6f 76  the columns abov
1c050 65 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  e.</param>..    
1c060 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1c070 22 73 65 70 61 72 61 74 6f 72 22 3e 43 6f 6d 6d  "separator">Comm
1c080 61 20 6f 72 20 6e 6f 74 68 69 6e 67 2c 20 64 65  a or nothing, de
1c090 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1c0a0 65 72 20 74 68 65 20 53 45 4c 45 43 54 0d 0a 20  er the SELECT.. 
1c0b0 20 20 20 2f 2f 2f 20 63 6c 61 75 73 65 20 69 73     /// clause is
1c0c0 20 65 6d 70 74 79 2e 3c 2f 70 61 72 61 6d 3e 0d   empty.</param>.
1c0d0 0a 20 20 20 20 76 6f 69 64 20 41 64 64 43 6f 6c  .    void AddCol
1c0e0 75 6d 6e 73 28 53 71 6c 53 65 6c 65 63 74 53 74  umns(SqlSelectSt
1c0f0 61 74 65 6d 65 6e 74 20 73 65 6c 65 63 74 53 74  atement selectSt
1c100 61 74 65 6d 65 6e 74 2c 20 53 79 6d 62 6f 6c 20  atement, Symbol 
1c110 73 79 6d 62 6f 6c 2c 0d 0a 20 20 20 20 20 20 20  symbol,..       
1c120 20 4c 69 73 74 3c 53 79 6d 62 6f 6c 3e 20 63 6f   List<Symbol> co
1c130 6c 75 6d 6e 4c 69 73 74 2c 20 44 69 63 74 69 6f  lumnList, Dictio
1c140 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 53 79 6d  nary<string, Sym
1c150 62 6f 6c 3e 20 63 6f 6c 75 6d 6e 44 69 63 74 69  bol> columnDicti
1c160 6f 6e 61 72 79 2c 20 72 65 66 20 73 74 72 69 6e  onary, ref strin
1c170 67 20 73 65 70 61 72 61 74 6f 72 29 0d 0a 20 20  g separator)..  
1c180 20 20 7b 0d 0a 20 20 20 20 20 20 4a 6f 69 6e 53    {..      JoinS
1c190 79 6d 62 6f 6c 20 6a 6f 69 6e 53 79 6d 62 6f 6c  ymbol joinSymbol
1c1a0 20 3d 20 73 79 6d 62 6f 6c 20 61 73 20 4a 6f 69   = symbol as Joi
1c1b0 6e 53 79 6d 62 6f 6c 3b 0d 0a 20 20 20 20 20 20  nSymbol;..      
1c1c0 69 66 20 28 6a 6f 69 6e 53 79 6d 62 6f 6c 20 21  if (joinSymbol !
1c1d0 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 7b  = null)..      {
1c1e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 6a  ..        if (!j
1c1f0 6f 69 6e 53 79 6d 62 6f 6c 2e 49 73 4e 65 73 74  oinSymbol.IsNest
1c200 65 64 4a 6f 69 6e 29 0d 0a 20 20 20 20 20 20 20  edJoin)..       
1c210 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f   {..          //
1c220 20 52 65 63 75 72 73 65 20 69 66 20 74 68 65 20   Recurse if the 
1c230 6a 6f 69 6e 20 73 79 6d 62 6f 6c 20 69 73 20 61  join symbol is a
1c240 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 66   collection of f
1c250 6c 61 74 74 65 6e 65 64 20 65 78 74 65 6e 74 73  lattened extents
1c260 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
1c270 61 63 68 20 28 53 79 6d 62 6f 6c 20 73 79 6d 20  ach (Symbol sym 
1c280 69 6e 20 6a 6f 69 6e 53 79 6d 62 6f 6c 2e 45 78  in joinSymbol.Ex
1c290 74 65 6e 74 4c 69 73 74 29 0d 0a 20 20 20 20 20  tentList)..     
1c2a0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1c2b0 20 20 20 20 2f 2f 20 69 66 20 73 79 6d 20 69 73      // if sym is
1c2c0 20 53 63 61 6c 61 72 54 79 70 65 20 6d 65 61 6e   ScalarType mean
1c2d0 73 20 77 65 20 61 72 65 20 61 74 20 62 61 73 65  s we are at base
1c2e0 20 63 61 73 65 20 69 6e 20 74 68 65 0d 0a 20 20   case in the..  
1c2f0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65 63            // rec
1c300 75 72 73 69 6f 6e 20 61 6e 64 20 74 68 65 72 65  ursion and there
1c310 20 61 72 65 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   are not columns
1c320 20 74 6f 20 61 64 64 2c 20 6a 75 73 74 20 73 6b   to add, just sk
1c330 69 70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ip..            
1c340 69 66 20 28 4d 65 74 61 64 61 74 61 48 65 6c 70  if (MetadataHelp
1c350 65 72 73 2e 49 73 50 72 69 6d 69 74 69 76 65 54  ers.IsPrimitiveT
1c360 79 70 65 28 73 79 6d 2e 54 79 70 65 29 29 0d 0a  ype(sym.Type))..
1c370 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1c390 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
1c3a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1c3b0 20 20 20 20 20 41 64 64 43 6f 6c 75 6d 6e 73 28       AddColumns(
1c3c0 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 2c  selectStatement,
1c3d0 20 73 79 6d 2c 20 63 6f 6c 75 6d 6e 4c 69 73 74   sym, columnList
1c3e0 2c 20 63 6f 6c 75 6d 6e 44 69 63 74 69 6f 6e 61  , columnDictiona
1c3f0 72 79 2c 20 72 65 66 20 73 65 70 61 72 61 74 6f  ry, ref separato
1c400 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  r);..          }
1c410 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1c420 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
1c430 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1c440 66 6f 72 65 61 63 68 20 28 53 79 6d 62 6f 6c 20  foreach (Symbol 
1c450 6a 6f 69 6e 43 6f 6c 75 6d 6e 20 69 6e 20 6a 6f  joinColumn in jo
1c460 69 6e 53 79 6d 62 6f 6c 2e 43 6f 6c 75 6d 6e 4c  inSymbol.ColumnL
1c470 69 73 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ist)..          
1c480 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  {..            /
1c490 2f 20 77 65 20 77 72 69 74 65 20 74 61 62 6c 65  / we write table
1c4a0 4e 61 6d 65 2e 63 6f 6c 75 6d 6e 4e 61 6d 65 0d  Name.columnName.
1c4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
1c4c0 72 61 74 68 65 72 20 74 68 61 6e 20 74 61 62 6c  rather than tabl
1c4d0 65 4e 61 6d 65 2e 63 6f 6c 75 6d 6e 4e 61 6d 65  eName.columnName
1c4e0 20 61 73 20 61 6c 69 61 73 0d 0a 20 20 20 20 20   as alias..     
1c4f0 20 20 20 20 20 20 20 2f 2f 20 73 69 6e 63 65 20         // since 
1c500 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
1c510 69 73 20 75 6e 69 71 75 65 20 28 62 79 20 74 68  is unique (by th
1c520 65 20 77 61 79 20 77 65 20 67 65 6e 65 72 61 74  e way we generat
1c530 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e new column nam
1c540 65 73 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  es)..           
1c550 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
1c560 20 2f 2f 20 57 65 20 75 73 65 20 74 68 65 20 73   // We use the s
1c570 79 6d 62 6f 6c 73 20 66 6f 72 20 62 6f 74 68 20  ymbols for both 
1c580 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
1c590 65 20 63 6f 6c 75 6d 6e 2c 0d 0a 20 20 20 20 20  e column,..     
1c5a0 20 20 20 20 20 20 20 2f 2f 20 73 69 6e 63 65 20         // since 
1c5b0 74 68 65 79 20 61 72 65 20 73 75 62 6a 65 63 74  they are subject
1c5c0 20 74 6f 20 72 65 6e 61 6d 69 6e 67 2e 0d 0a 20   to renaming... 
1c5d0 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63             selec
1c5e0 74 53 74 61 74 65 6d 65 6e 74 2e 53 65 6c 65 63  tStatement.Selec
1c5f0 74 2e 41 70 70 65 6e 64 28 73 65 70 61 72 61 74  t.Append(separat
1c600 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  or);..          
1c610 20 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e    selectStatemen
1c620 74 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28  t.Select.Append(
1c630 73 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20 20 20  symbol);..      
1c640 20 20 20 20 20 20 73 65 6c 65 63 74 53 74 61 74        selectStat
1c650 65 6d 65 6e 74 2e 53 65 6c 65 63 74 2e 41 70 70  ement.Select.App
1c660 65 6e 64 28 22 2e 22 29 3b 0d 0a 20 20 20 20 20  end(".");..     
1c670 20 20 20 20 20 20 20 73 65 6c 65 63 74 53 74 61         selectSta
1c680 74 65 6d 65 6e 74 2e 53 65 6c 65 63 74 2e 41 70  tement.Select.Ap
1c690 70 65 6e 64 28 6a 6f 69 6e 43 6f 6c 75 6d 6e 29  pend(joinColumn)
1c6a0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1c6b0 20 2f 2f 20 63 68 65 63 6b 20 66 6f 72 20 6e 61   // check for na
1c6c0 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 20 20  me collisions.  
1c6d0 49 66 20 74 68 65 72 65 20 69 73 2c 0d 0a 20 20  If there is,..  
1c6e0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 6c 61            // fla
1c6f0 67 20 62 6f 74 68 20 74 68 65 20 63 6f 6c 6c 69  g both the colli
1c700 64 69 6e 67 20 73 79 6d 62 6f 6c 73 2e 0d 0a 20  ding symbols... 
1c710 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
1c720 6f 6c 75 6d 6e 44 69 63 74 69 6f 6e 61 72 79 2e  olumnDictionary.
1c730 43 6f 6e 74 61 69 6e 73 4b 65 79 28 6a 6f 69 6e  ContainsKey(join
1c740 43 6f 6c 75 6d 6e 2e 4e 61 6d 65 29 29 0d 0a 20  Column.Name)).. 
1c750 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1c760 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
1c770 6d 6e 44 69 63 74 69 6f 6e 61 72 79 5b 6a 6f 69  mnDictionary[joi
1c780 6e 43 6f 6c 75 6d 6e 2e 4e 61 6d 65 5d 2e 4e 65  nColumn.Name].Ne
1c790 65 64 73 52 65 6e 61 6d 69 6e 67 20 3d 20 74 72  edsRenaming = tr
1c7a0 75 65 3b 20 2f 2f 20 74 68 65 20 6f 72 69 67 69  ue; // the origi
1c7b0 6e 61 6c 20 73 79 6d 62 6f 6c 0d 0a 20 20 20 20  nal symbol..    
1c7c0 20 20 20 20 20 20 20 20 20 20 6a 6f 69 6e 43 6f            joinCo
1c7d0 6c 75 6d 6e 2e 4e 65 65 64 73 52 65 6e 61 6d 69  lumn.NeedsRenami
1c7e0 6e 67 20 3d 20 74 72 75 65 3b 20 2f 2f 20 74 68  ng = true; // th
1c7f0 65 20 63 75 72 72 65 6e 74 20 73 79 6d 62 6f 6c  e current symbol
1c800 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ...            }
1c810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ..            el
1c820 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
1c830 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c840 20 63 6f 6c 75 6d 6e 44 69 63 74 69 6f 6e 61 72   columnDictionar
1c850 79 5b 6a 6f 69 6e 43 6f 6c 75 6d 6e 2e 4e 61 6d  y[joinColumn.Nam
1c860 65 5d 20 3d 20 6a 6f 69 6e 43 6f 6c 75 6d 6e 3b  e] = joinColumn;
1c870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1c880 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ...            c
1c890 6f 6c 75 6d 6e 4c 69 73 74 2e 41 64 64 28 6a 6f  olumnList.Add(jo
1c8a0 69 6e 43 6f 6c 75 6d 6e 29 3b 0d 0a 0d 0a 20 20  inColumn);....  
1c8b0 20 20 20 20 20 20 20 20 20 20 73 65 70 61 72 61            separa
1c8c0 74 6f 72 20 3d 20 22 2c 20 22 3b 0d 0a 20 20 20  tor = ", ";..   
1c8d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c8e0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1c8f0 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
1c900 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 68  {..        // Th
1c910 69 73 20 69 73 20 61 20 6e 6f 6e 2d 6a 6f 69 6e  is is a non-join
1c920 20 65 78 74 65 6e 74 2f 73 65 6c 65 63 74 20 73   extent/select s
1c930 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 74 68  tatement, and th
1c940 65 20 43 51 54 20 74 79 70 65 20 68 61 73 0d 0a  e CQT type has..
1c950 20 20 20 20 20 20 20 20 2f 2f 20 74 68 65 20 72          // the r
1c960 65 6c 65 76 61 6e 74 20 63 6f 6c 75 6d 6e 20 69  elevant column i
1c970 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 0d 0a 20  nformation..... 
1c980 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20 74 79         // The ty
1c990 70 65 20 63 6f 75 6c 64 20 62 65 20 61 20 72 65  pe could be a re
1c9a0 63 6f 72 64 20 74 79 70 65 28 65 2e 67 2e 20 50  cord type(e.g. P
1c9b0 72 6f 6a 65 63 74 28 2e 2e 2e 29 2c 0d 0a 20 20  roject(...),..  
1c9c0 20 20 20 20 20 20 2f 2f 20 6f 72 20 61 6e 20 65        // or an e
1c9d0 6e 74 69 74 79 20 74 79 70 65 20 28 20 65 2e 67  ntity type ( e.g
1c9e0 2e 20 45 6e 74 69 74 79 45 78 70 72 65 73 73 69  . EntityExpressi
1c9f0 6f 6e 28 2e 2e 2e 29 0d 0a 20 20 20 20 20 20 20  on(...)..       
1ca00 20 2f 2f 20 73 6f 2c 20 77 65 20 63 68 65 63 6b   // so, we check
1ca10 20 77 68 65 74 68 65 72 20 69 74 20 69 73 20 61   whether it is a
1ca20 20 73 74 72 75 63 74 75 72 61 6c 54 79 70 65 2e   structuralType.
1ca30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 43  ....        // C
1ca40 6f 6e 73 69 64 65 72 20 61 6e 20 65 78 70 72 65  onsider an expre
1ca50 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ssion of the for
1ca60 6d 20 4a 28 61 2c 20 62 3d 50 28 45 29 29 0d 0a  m J(a, b=P(E))..
1ca70 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20 69          // The i
1ca80 6e 6e 65 72 20 50 28 45 29 20 77 6f 75 6c 64 20  nner P(E) would 
1ca90 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73 6c  have been transl
1caa0 61 74 65 64 20 74 6f 20 61 20 53 51 4c 20 73 74  ated to a SQL st
1cab0 61 74 65 6d 65 6e 74 0d 0a 20 20 20 20 20 20 20  atement..       
1cac0 20 2f 2f 20 57 65 20 73 68 6f 75 6c 64 20 6e 6f   // We should no
1cad0 74 20 75 73 65 20 74 68 65 20 72 61 77 20 6e 61  t use the raw na
1cae0 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 74 79 70  mes from the typ
1caf0 65 2c 20 62 75 74 20 74 68 65 20 65 71 75 69 76  e, but the equiv
1cb00 61 6c 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 2f  alent..        /
1cb10 2f 20 73 79 6d 62 6f 6c 73 20 28 74 68 65 79 20  / symbols (they 
1cb20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 73  are present in s
1cb30 79 6d 62 6f 6c 2e 43 6f 6c 75 6d 6e 73 29 20 69  ymbol.Columns) i
1cb40 66 20 74 68 65 79 20 65 78 69 73 74 2e 0d 0a 20  f they exist... 
1cb50 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
1cb60 20 20 20 2f 2f 20 57 65 20 61 64 64 20 74 68 65     // We add the
1cb70 20 6e 65 77 20 63 6f 6c 75 6d 6e 73 20 74 6f 20   new columns to 
1cb80 74 68 65 20 73 79 6d 62 6f 6c 27 73 20 63 6f 6c  the symbol's col
1cb90 75 6d 6e 73 20 69 66 20 74 68 65 79 20 64 6f 0d  umns if they do.
1cba0 0a 20 20 20 20 20 20 20 20 2f 2f 20 6e 6f 74 20  .        // not 
1cbb0 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0d 0a  already exist...
1cbc0 20 20 20 20 20 20 20 20 2f 2f 0d 0a 0d 0a 20 20          //....  
1cbd0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 45        foreach (E
1cbe0 64 6d 50 72 6f 70 65 72 74 79 20 70 72 6f 70 65  dmProperty prope
1cbf0 72 74 79 20 69 6e 20 4d 65 74 61 64 61 74 61 48  rty in MetadataH
1cc00 65 6c 70 65 72 73 2e 47 65 74 50 72 6f 70 65 72  elpers.GetProper
1cc10 74 69 65 73 28 73 79 6d 62 6f 6c 2e 54 79 70 65  ties(symbol.Type
1cc20 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ))..        {.. 
1cc30 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
1cc40 72 65 63 6f 72 64 4d 65 6d 62 65 72 4e 61 6d 65  recordMemberName
1cc50 20 3d 20 70 72 6f 70 65 72 74 79 2e 4e 61 6d 65   = property.Name
1cc60 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20  ;..          // 
1cc70 53 69 6e 63 65 20 61 6c 6c 20 72 65 6e 61 6d 69  Since all renami
1cc80 6e 67 20 68 61 70 70 65 6e 73 20 69 6e 20 74 68  ng happens in th
1cc90 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 0d 0a  e second phase..
1cca0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 77 65 20            // we 
1ccb0 6c 6f 73 65 20 6e 6f 74 68 69 6e 67 20 62 79 20  lose nothing by 
1ccc0 73 65 74 74 69 6e 67 20 74 68 65 20 6e 65 78 74  setting the next
1ccd0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 64   column name ind
1cce0 65 78 20 74 6f 20 30 0d 0a 20 20 20 20 20 20 20  ex to 0..       
1ccf0 20 20 20 2f 2f 20 6d 61 6e 79 20 74 69 6d 65 73     // many times
1cd00 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  ...          all
1cd10 43 6f 6c 75 6d 6e 4e 61 6d 65 73 5b 72 65 63 6f  ColumnNames[reco
1cd20 72 64 4d 65 6d 62 65 72 4e 61 6d 65 5d 20 3d 20  rdMemberName] = 
1cd30 30 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  0;....          
1cd40 2f 2f 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  // Create a new 
1cd50 73 79 6d 62 6f 6c 2f 72 65 75 73 65 20 65 78 69  symbol/reuse exi
1cd60 73 74 69 6e 67 20 73 79 6d 62 6f 6c 20 66 6f 72  sting symbol for
1cd70 20 74 68 65 20 63 6f 6c 75 6d 6e 0d 0a 20 20 20   the column..   
1cd80 20 20 20 20 20 20 20 53 79 6d 62 6f 6c 20 63 6f         Symbol co
1cd90 6c 75 6d 6e 53 79 6d 62 6f 6c 3b 0d 0a 20 20 20  lumnSymbol;..   
1cda0 20 20 20 20 20 20 20 69 66 20 28 21 73 79 6d 62         if (!symb
1cdb0 6f 6c 2e 43 6f 6c 75 6d 6e 73 2e 54 72 79 47 65  ol.Columns.TryGe
1cdc0 74 56 61 6c 75 65 28 72 65 63 6f 72 64 4d 65 6d  tValue(recordMem
1cdd0 62 65 72 4e 61 6d 65 2c 20 6f 75 74 20 63 6f 6c  berName, out col
1cde0 75 6d 6e 53 79 6d 62 6f 6c 29 29 0d 0a 20 20 20  umnSymbol))..   
1cdf0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1ce00 20 20 20 20 20 20 2f 2f 20 77 65 20 64 6f 20 6e        // we do n
1ce10 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1ce20 65 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  e types of colum
1ce30 6e 73 2c 20 73 6f 20 77 65 20 70 61 73 73 20 6e  ns, so we pass n
1ce40 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
1ce50 20 2f 2f 20 77 68 65 6e 20 63 6f 6e 73 74 72 75   // when constru
1ce60 63 74 69 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c  ction the symbol
1ce70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ...            c
1ce80 6f 6c 75 6d 6e 53 79 6d 62 6f 6c 20 3d 20 6e 65  olumnSymbol = ne
1ce90 77 20 53 79 6d 62 6f 6c 28 72 65 63 6f 72 64 4d  w Symbol(recordM
1cea0 65 6d 62 65 72 4e 61 6d 65 2c 20 6e 75 6c 6c 29  emberName, null)
1ceb0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ;..            s
1cec0 79 6d 62 6f 6c 2e 43 6f 6c 75 6d 6e 73 2e 41 64  ymbol.Columns.Ad
1ced0 64 28 72 65 63 6f 72 64 4d 65 6d 62 65 72 4e 61  d(recordMemberNa
1cee0 6d 65 2c 20 63 6f 6c 75 6d 6e 53 79 6d 62 6f 6c  me, columnSymbol
1cef0 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
1cf00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c  ...          sel
1cf10 65 63 74 53 74 61 74 65 6d 65 6e 74 2e 53 65 6c  ectStatement.Sel
1cf20 65 63 74 2e 41 70 70 65 6e 64 28 73 65 70 61 72  ect.Append(separ
1cf30 61 74 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20  ator);..        
1cf40 20 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e    selectStatemen
1cf50 74 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e 64 28  t.Select.Append(
1cf60 73 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20 20 20  symbol);..      
1cf70 20 20 20 20 73 65 6c 65 63 74 53 74 61 74 65 6d      selectStatem
1cf80 65 6e 74 2e 53 65 6c 65 63 74 2e 41 70 70 65 6e  ent.Select.Appen
1cf90 64 28 22 2e 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  d(".");....     
1cfa0 20 20 20 20 20 2f 2f 20 57 65 20 75 73 65 20 74       // We use t
1cfb0 68 65 20 61 63 74 75 61 6c 20 6e 61 6d 65 20 62  he actual name b
1cfc0 65 66 6f 72 65 20 74 68 65 20 22 41 53 22 2c 20  efore the "AS", 
1cfd0 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 67 6f 65  the new name goe
1cfe0 73 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20  s..          // 
1cff0 61 66 74 65 72 20 74 68 65 20 41 53 2e 0d 0a 20  after the AS... 
1d000 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 53           selectS
1d010 74 61 74 65 6d 65 6e 74 2e 53 65 6c 65 63 74 2e  tatement.Select.
1d020 41 70 70 65 6e 64 28 51 75 6f 74 65 49 64 65 6e  Append(QuoteIden
1d030 74 69 66 69 65 72 28 72 65 63 6f 72 64 4d 65 6d  tifier(recordMem
1d040 62 65 72 4e 61 6d 65 29 29 3b 0d 0a 0d 0a 20 20  berName));....  
1d050 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 53 74          selectSt
1d060 61 74 65 6d 65 6e 74 2e 53 65 6c 65 63 74 2e 41  atement.Select.A
1d070 70 70 65 6e 64 28 22 20 41 53 20 22 29 3b 0d 0a  ppend(" AS ");..
1d080 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
1d090 53 74 61 74 65 6d 65 6e 74 2e 53 65 6c 65 63 74  Statement.Select
1d0a0 2e 41 70 70 65 6e 64 28 63 6f 6c 75 6d 6e 53 79  .Append(columnSy
1d0b0 6d 62 6f 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  mbol);....      
1d0c0 20 20 20 20 2f 2f 20 43 68 65 63 6b 20 66 6f 72      // Check for
1d0d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 63 6f 6c   column name col
1d0e0 6c 69 73 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20  lisions...      
1d0f0 20 20 20 20 69 66 20 28 63 6f 6c 75 6d 6e 44 69      if (columnDi
1d100 63 74 69 6f 6e 61 72 79 2e 43 6f 6e 74 61 69 6e  ctionary.Contain
1d110 73 4b 65 79 28 72 65 63 6f 72 64 4d 65 6d 62 65  sKey(recordMembe
1d120 72 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20  rName))..       
1d130 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1d140 20 20 63 6f 6c 75 6d 6e 44 69 63 74 69 6f 6e 61    columnDictiona
1d150 72 79 5b 72 65 63 6f 72 64 4d 65 6d 62 65 72 4e  ry[recordMemberN
1d160 61 6d 65 5d 2e 4e 65 65 64 73 52 65 6e 61 6d 69  ame].NeedsRenami
1d170 6e 67 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ng = true;..    
1d180 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 53 79          columnSy
1d190 6d 62 6f 6c 2e 4e 65 65 64 73 52 65 6e 61 6d 69  mbol.NeedsRenami
1d1a0 6e 67 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ng = true;..    
1d1b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d1c0 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
1d1d0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1d1e0 20 20 63 6f 6c 75 6d 6e 44 69 63 74 69 6f 6e 61    columnDictiona
1d1f0 72 79 5b 72 65 63 6f 72 64 4d 65 6d 62 65 72 4e  ry[recordMemberN
1d200 61 6d 65 5d 20 3d 20 73 79 6d 62 6f 6c 2e 43 6f  ame] = symbol.Co
1d210 6c 75 6d 6e 73 5b 72 65 63 6f 72 64 4d 65 6d 62  lumns[recordMemb
1d220 65 72 4e 61 6d 65 5d 3b 0d 0a 20 20 20 20 20 20  erName];..      
1d230 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d240 20 20 20 63 6f 6c 75 6d 6e 4c 69 73 74 2e 41 64     columnList.Ad
1d250 64 28 63 6f 6c 75 6d 6e 53 79 6d 62 6f 6c 29 3b  d(columnSymbol);
1d260 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
1d270 70 61 72 61 74 6f 72 20 3d 20 22 2c 20 22 3b 0d  parator = ", ";.
1d280 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1d290 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
1d2a0 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
1d2b0 0a 20 20 20 20 2f 2f 2f 20 45 78 70 61 6e 64 73  .    /// Expands
1d2c0 20 53 65 6c 65 63 74 20 2a 20 74 6f 20 22 73 65   Select * to "se
1d2d0 6c 65 63 74 20 74 68 65 5f 6c 69 73 74 5f 6f 66  lect the_list_of
1d2e0 5f 63 6f 6c 75 6d 6e 73 22 0d 0a 20 20 20 20 2f  _columns"..    /
1d2f0 2f 2f 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  // If the column
1d300 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
1d310 20 61 6e 20 65 78 74 65 6e 74 2c 20 74 68 65 79   an extent, they
1d320 20 61 72 65 20 77 72 69 74 74 65 6e 20 61 73 0d   are written as.
1d330 0a 20 20 20 20 2f 2f 2f 20 7b 6f 72 69 67 69 6e  .    /// {origin
1d340 61 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 41  al_column_name A
1d350 53 20 53 79 6d 62 6f 6c 28 6f 72 69 67 69 6e 61  S Symbol(origina
1d360 6c 5f 63 6f 6c 75 6d 6e 29 7d 20 74 6f 20 61 6c  l_column)} to al
1d370 6c 6f 77 20 72 65 6e 61 6d 69 6e 67 2e 0d 0a 20  low renaming... 
1d380 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20     ///..    /// 
1d390 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  If the columns a
1d3a0 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 61 20  re taken from a 
1d3b0 4a 6f 69 6e 2c 20 74 68 65 79 20 61 72 65 20 77  Join, they are w
1d3c0 72 69 74 74 65 6e 20 61 73 20 6a 75 73 74 0d 0a  ritten as just..
1d3d0 20 20 20 20 2f 2f 2f 20 7b 6f 72 69 67 69 6e 61      /// {origina
1d3e0 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 7d 2c 20  l_column_name}, 
1d3f0 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 6e  since there cann
1d400 6f 74 20 62 65 20 61 20 6e 61 6d 65 20 63 6f 6c  ot be a name col
1d410 6c 69 73 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f  lision...    ///
1d420 0d 0a 20 20 20 20 2f 2f 2f 20 57 65 20 63 6f 6e  ..    /// We con
1d430 63 61 74 65 6e 61 74 65 20 74 68 65 20 63 6f 6c  catenate the col
1d440 75 6d 6e 73 20 66 72 6f 6d 20 65 61 63 68 20 6f  umns from each o
1d450 66 20 74 68 65 20 69 6e 70 75 74 73 20 74 6f 20  f the inputs to 
1d460 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
1d470 6d 65 6e 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 53  ment...    /// S
1d480 69 6e 63 65 20 74 68 65 20 69 6e 70 75 74 73 20  ince the inputs 
1d490 6d 61 79 20 62 65 20 6a 6f 69 6e 73 20 74 68 61  may be joins tha
1d4a0 74 20 61 72 65 20 66 6c 61 74 74 65 6e 65 64 2c  t are flattened,
1d4b0 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 63 75   we need to recu
1d4c0 72 73 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  rse...    /// Th
1d4d0 65 20 69 6e 70 75 74 73 20 61 72 65 20 69 6e 66  e inputs are inf
1d4e0 65 72 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  erred from the s
1d4f0 79 6d 62 6f 6c 73 20 69 6e 20 46 72 6f 6d 45 78  ymbols in FromEx
1d500 74 65 6e 74 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20  tents...    /// 
1d510 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
1d520 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1d530 22 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74  "selectStatement
1d540 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  "></param>..    
1d550 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72  /// <returns></r
1d560 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 4c 69 73  eturns>..    Lis
1d570 74 3c 53 79 6d 62 6f 6c 3e 20 41 64 64 44 65 66  t<Symbol> AddDef
1d580 61 75 6c 74 43 6f 6c 75 6d 6e 73 28 53 71 6c 53  aultColumns(SqlS
1d590 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 20 73  electStatement s
1d5a0 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 29 0d  electStatement).
1d5b0 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 2f 2f  .    {..      //
1d5c0 20 54 68 69 73 20 69 73 20 74 68 65 20 6c 69 73   This is the lis
1d5d0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 64 64  t of columns add
1d5e0 65 64 20 69 6e 20 74 68 69 73 20 73 65 6c 65 63  ed in this selec
1d5f0 74 20 73 74 61 74 65 6d 65 6e 74 0d 0a 20 20 20  t statement..   
1d600 20 20 20 2f 2f 20 54 68 69 73 20 66 6f 72 6d 73     // This forms
1d610 20 74 68 65 20 22 74 79 70 65 22 20 6f 66 20 74   the "type" of t
1d620 68 65 20 53 65 6c 65 63 74 20 73 74 61 74 65 6d  he Select statem
1d630 65 6e 74 2c 20 69 66 20 69 74 20 68 61 73 20 74  ent, if it has t
1d640 6f 0d 0a 20 20 20 20 20 20 2f 2f 20 62 65 20 65  o..      // be e
1d650 78 70 61 6e 64 65 64 20 69 6e 20 61 6e 6f 74 68  xpanded in anoth
1d660 65 72 20 53 45 4c 45 43 54 20 2a 0d 0a 20 20 20  er SELECT *..   
1d670 20 20 20 4c 69 73 74 3c 53 79 6d 62 6f 6c 3e 20     List<Symbol> 
1d680 63 6f 6c 75 6d 6e 4c 69 73 74 20 3d 20 6e 65 77  columnList = new
1d690 20 4c 69 73 74 3c 53 79 6d 62 6f 6c 3e 28 29 3b   List<Symbol>();
1d6a0 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 41 20 6c  ....      // A l
1d6b0 6f 6f 6b 75 70 20 66 6f 72 20 74 68 65 20 70 72  ookup for the pr
1d6c0 65 76 69 6f 75 73 20 73 65 74 20 6f 66 20 63 6f  evious set of co
1d6d0 6c 75 6d 6e 73 20 74 6f 20 61 69 64 20 63 6f 6c  lumns to aid col
1d6e0 75 6d 6e 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20  umn name..      
1d6f0 2f 2f 20 63 6f 6c 6c 69 73 69 6f 6e 20 64 65 74  // collision det
1d700 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 44  ection...      D
1d710 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67  ictionary<string
1d720 2c 20 53 79 6d 62 6f 6c 3e 20 63 6f 6c 75 6d 6e  , Symbol> column
1d730 44 69 63 74 69 6f 6e 61 72 79 20 3d 20 6e 65 77  Dictionary = new
1d740 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69   Dictionary<stri
1d750 6e 67 2c 20 53 79 6d 62 6f 6c 3e 28 53 74 72 69  ng, Symbol>(Stri
1d760 6e 67 43 6f 6d 70 61 72 65 72 2e 4f 72 64 69 6e  ngComparer.Ordin
1d770 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 3b 0d 0a  alIgnoreCase);..
1d780 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 73  ..      string s
1d790 65 70 61 72 61 74 6f 72 20 3d 20 53 74 72 69 6e  eparator = Strin
1d7a0 67 2e 45 6d 70 74 79 3b 0d 0a 20 20 20 20 20 20  g.Empty;..      
1d7b0 2f 2f 20 54 68 65 20 53 65 6c 65 63 74 20 73 68  // The Select sh
1d7c0 6f 75 6c 64 20 75 73 75 61 6c 6c 79 20 62 65 20  ould usually be 
1d7d0 65 6d 70 74 79 20 62 65 66 6f 72 65 20 77 65 20  empty before we 
1d7e0 61 72 65 20 63 61 6c 6c 65 64 2c 0d 0a 20 20 20  are called,..   
1d7f0 20 20 20 2f 2f 20 62 75 74 20 77 65 20 64 6f 20     // but we do 
1d800 6e 6f 74 20 6d 69 6e 64 20 69 66 20 69 74 20 69  not mind if it i
1d810 73 20 6e 6f 74 2e 0d 0a 20 20 20 20 20 20 69 66  s not...      if
1d820 20 28 21 73 65 6c 65 63 74 53 74 61 74 65 6d 65   (!selectStateme
1d830 6e 74 2e 53 65 6c 65 63 74 2e 49 73 45 6d 70 74  nt.Select.IsEmpt
1d840 79 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  y)..      {..   
1d850 20 20 20 20 20 73 65 70 61 72 61 74 6f 72 20 3d       separator =
1d860 20 22 2c 20 22 3b 0d 0a 20 20 20 20 20 20 7d 0d   ", ";..      }.
1d870 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
1d880 20 28 53 79 6d 62 6f 6c 20 73 79 6d 62 6f 6c 20   (Symbol symbol 
1d890 69 6e 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65  in selectStateme
1d8a0 6e 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73 29 0d  nt.FromExtents).
1d8b0 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
1d8c0 20 20 41 64 64 43 6f 6c 75 6d 6e 73 28 73 65 6c    AddColumns(sel
1d8d0 65 63 74 53 74 61 74 65 6d 65 6e 74 2c 20 73 79  ectStatement, sy
1d8e0 6d 62 6f 6c 2c 20 63 6f 6c 75 6d 6e 4c 69 73 74  mbol, columnList
1d8f0 2c 20 63 6f 6c 75 6d 6e 44 69 63 74 69 6f 6e 61  , columnDictiona
1d900 72 79 2c 20 72 65 66 20 73 65 70 61 72 61 74 6f  ry, ref separato
1d910 72 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  r);..      }....
1d920 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6c        return col
1d930 75 6d 6e 4c 69 73 74 3b 0d 0a 20 20 20 20 7d 0d  umnList;..    }.
1d940 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
1d950 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  ary>..    /// <s
1d960 65 65 20 63 72 65 66 3d 22 41 64 64 46 72 6f 6d  ee cref="AddFrom
1d970 53 79 6d 62 6f 6c 28 53 71 6c 53 65 6c 65 63 74  Symbol(SqlSelect
1d980 53 74 61 74 65 6d 65 6e 74 2c 20 73 74 72 69 6e  Statement, strin
1d990 67 2c 20 53 79 6d 62 6f 6c 2c 20 62 6f 6f 6c 29  g, Symbol, bool)
1d9a0 22 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  "/>..    /// </s
1d9b0 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
1d9c0 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 65   <param name="se
1d9d0 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 22 3e 3c  lectStatement"><
1d9e0 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
1d9f0 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 6e   <param name="in
1da00 70 75 74 56 61 72 4e 61 6d 65 22 3e 3c 2f 70 61  putVarName"></pa
1da10 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
1da20 61 72 61 6d 20 6e 61 6d 65 3d 22 66 72 6f 6d 53  aram name="fromS
1da30 79 6d 62 6f 6c 22 3e 3c 2f 70 61 72 61 6d 3e 0d  ymbol"></param>.
1da40 0a 20 20 20 20 76 6f 69 64 20 41 64 64 46 72 6f  .    void AddFro
1da50 6d 53 79 6d 62 6f 6c 28 53 71 6c 53 65 6c 65 63  mSymbol(SqlSelec
1da60 74 53 74 61 74 65 6d 65 6e 74 20 73 65 6c 65 63  tStatement selec
1da70 74 53 74 61 74 65 6d 65 6e 74 2c 20 73 74 72 69  tStatement, stri
1da80 6e 67 20 69 6e 70 75 74 56 61 72 4e 61 6d 65 2c  ng inputVarName,
1da90 20 53 79 6d 62 6f 6c 20 66 72 6f 6d 53 79 6d 62   Symbol fromSymb
1daa0 6f 6c 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  ol)..    {..    
1dab0 20 20 41 64 64 46 72 6f 6d 53 79 6d 62 6f 6c 28    AddFromSymbol(
1dac0 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 2c  selectStatement,
1dad0 20 69 6e 70 75 74 56 61 72 4e 61 6d 65 2c 20 66   inputVarName, f
1dae0 72 6f 6d 53 79 6d 62 6f 6c 2c 20 74 72 75 65 29  romSymbol, true)
1daf0 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
1db00 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
1db10 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68     /// This meth
1db20 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  od is called aft
1db30 65 72 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  er the input to 
1db40 61 20 72 65 6c 61 74 69 6f 6e 61 6c 20 6e 6f 64  a relational nod
1db50 65 20 69 73 20 76 69 73 69 74 65 64 2e 0d 0a 20  e is visited... 
1db60 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66     /// <see cref
1db70 3d 22 56 69 73 69 74 28 44 62 50 72 6f 6a 65 63  ="Visit(DbProjec
1db80 74 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e 20  tExpression)"/> 
1db90 61 6e 64 20 3c 73 65 65 20 63 72 65 66 3d 22 50  and <see cref="P
1dba0 72 6f 63 65 73 73 4a 6f 69 6e 49 6e 70 75 74 52  rocessJoinInputR
1dbb0 65 73 75 6c 74 22 2f 3e 0d 0a 20 20 20 20 2f 2f  esult"/>..    //
1dbc0 2f 20 54 68 65 72 65 20 61 72 65 20 32 20 73 63  / There are 2 sc
1dbd0 65 6e 61 72 69 6f 73 0d 0a 20 20 20 20 2f 2f 2f  enarios..    ///
1dbe0 20 3c 6c 69 73 74 20 74 79 70 65 3d 22 6e 75 6d   <list type="num
1dbf0 62 65 72 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ber">..    /// <
1dc00 69 74 65 6d 3e 54 68 65 20 66 72 6f 6d 53 79 6d  item>The fromSym
1dc10 62 6f 6c 20 69 73 20 6e 65 77 20 69 2e 65 2e 20  bol is new i.e. 
1dc20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
1dc30 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65  ment has just be
1dc40 65 6e 0d 0a 20 20 20 20 2f 2f 2f 20 63 72 65 61  en..    /// crea
1dc50 74 65 64 2c 20 6f 72 20 61 20 6a 6f 69 6e 20 65  ted, or a join e
1dc60 78 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 61  xtent has been a
1dc70 64 64 65 64 2e 3c 2f 69 74 65 6d 3e 0d 0a 20 20  dded.</item>..  
1dc80 20 20 2f 2f 2f 20 3c 69 74 65 6d 3e 54 68 65 20    /// <item>The 
1dc90 66 72 6f 6d 53 79 6d 62 6f 6c 20 69 73 20 6f 6c  fromSymbol is ol
1dca0 64 20 69 2e 65 2e 20 77 65 20 61 72 65 20 72 65  d i.e. we are re
1dcb0 75 73 69 6e 67 20 61 20 73 65 6c 65 63 74 20 73  using a select s
1dcc0 74 61 74 65 6d 65 6e 74 2e 3c 2f 69 74 65 6d 3e  tatement.</item>
1dcd0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 6c 69 73 74  ..    /// </list
1dce0 3e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20  >..    ///..    
1dcf0 2f 2f 2f 20 49 66 20 77 65 20 61 72 65 20 6e 6f  /// If we are no
1dd00 74 20 72 65 75 73 69 6e 67 20 74 68 65 20 73 65  t reusing the se
1dd10 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2c 20  lect statement, 
1dd20 77 65 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 6c  we have to compl
1dd30 65 74 65 20 74 68 65 0d 0a 20 20 20 20 2f 2f 2f  ete the..    ///
1dd40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 74   FROM clause wit
1dd50 68 20 74 68 65 20 61 6c 69 61 73 0d 0a 20 20 20  h the alias..   
1dd60 20 2f 2f 2f 20 3c 63 6f 64 65 3e 0d 0a 20 20 20   /// <code>..   
1dd70 20 2f 2f 2f 20 2d 2d 20 69 66 20 74 68 65 20 69   /// -- if the i
1dd80 6e 70 75 74 20 77 61 73 20 61 6e 20 65 78 74 65  nput was an exte
1dd90 6e 74 0d 0a 20 20 20 20 2f 2f 2f 20 46 52 4f 4d  nt..    /// FROM
1dda0 20 3d 20 5b 53 63 68 65 6d 61 4e 61 6d 65 5d 2e   = [SchemaName].
1ddb0 5b 54 61 62 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20  [TableName]..   
1ddc0 20 2f 2f 2f 20 2d 2d 20 69 66 20 74 68 65 20 69   /// -- if the i
1ddd0 6e 70 75 74 20 77 61 73 20 61 20 50 72 6f 6a 65  nput was a Proje
1dde0 63 74 0d 0a 20 20 20 20 2f 2f 2f 20 46 52 4f 4d  ct..    /// FROM
1ddf0 20 3d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46   = (SELECT ... F
1de00 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 2e 2e  ROM ... WHERE ..
1de10 2e 29 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f  .)..    /// </co
1de20 64 65 3e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20  de>..    ///..  
1de30 20 20 2f 2f 2f 20 54 68 65 73 65 20 62 65 63 6f    /// These beco
1de40 6d 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 63 6f 64  me..    /// <cod
1de50 65 3e 0d 0a 20 20 20 20 2f 2f 2f 20 2d 2d 20 69  e>..    /// -- i
1de60 66 20 74 68 65 20 69 6e 70 75 74 20 77 61 73 20  f the input was 
1de70 61 6e 20 65 78 74 65 6e 74 0d 0a 20 20 20 20 2f  an extent..    /
1de80 2f 2f 20 46 52 4f 4d 20 3d 20 5b 53 63 68 65 6d  // FROM = [Schem
1de90 61 4e 61 6d 65 5d 2e 5b 54 61 62 6c 65 4e 61 6d  aName].[TableNam
1dea0 65 5d 20 41 53 20 61 6c 69 61 73 0d 0a 20 20 20  e] AS alias..   
1deb0 20 2f 2f 2f 20 2d 2d 20 69 66 20 74 68 65 20 69   /// -- if the i
1dec0 6e 70 75 74 20 77 61 73 20 61 20 50 72 6f 6a 65  nput was a Proje
1ded0 63 74 0d 0a 20 20 20 20 2f 2f 2f 20 46 52 4f 4d  ct..    /// FROM
1dee0 20 3d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46   = (SELECT ... F
1def0 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 2e 2e  ROM ... WHERE ..
1df00 2e 29 20 41 53 20 61 6c 69 61 73 0d 0a 20 20 20  .) AS alias..   
1df10 20 2f 2f 2f 20 3c 2f 63 6f 64 65 3e 0d 0a 20 20   /// </code>..  
1df20 20 20 2f 2f 2f 20 61 6e 64 20 6c 6f 6f 6b 20 6c    /// and look l
1df30 69 6b 65 20 76 61 6c 69 64 20 46 52 4f 4d 20 63  ike valid FROM c
1df40 6c 61 75 73 65 73 2e 0d 0a 20 20 20 20 2f 2f 2f  lauses...    ///
1df50 0d 0a 20 20 20 20 2f 2f 2f 20 46 69 6e 61 6c 6c  ..    /// Finall
1df60 79 2c 20 77 65 20 68 61 76 65 20 74 6f 20 61 64  y, we have to ad
1df70 64 20 74 68 65 20 61 6c 69 61 73 20 74 6f 20 74  d the alias to t
1df80 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 6f  he global list o
1df90 66 20 61 6c 69 61 73 65 73 20 75 73 65 64 2c 0d  f aliases used,.
1dfa0 0a 20 20 20 20 2f 2f 2f 20 61 6e 64 20 61 6c 73  .    /// and als
1dfb0 6f 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  o to the current
1dfc0 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 2e 0d 0a   symbol table...
1dfd0 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
1dfe0 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  y>..    /// <par
1dff0 61 6d 20 6e 61 6d 65 3d 22 73 65 6c 65 63 74 53  am name="selectS
1e000 74 61 74 65 6d 65 6e 74 22 3e 3c 2f 70 61 72 61  tatement"></para
1e010 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
1e020 61 6d 20 6e 61 6d 65 3d 22 69 6e 70 75 74 56 61  am name="inputVa
1e030 72 4e 61 6d 65 22 3e 54 68 65 20 61 6c 69 61 73  rName">The alias
1e040 20 74 6f 20 62 65 20 75 73 65 64 2e 3c 2f 70 61   to be used.</pa
1e050 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
1e060 61 72 61 6d 20 6e 61 6d 65 3d 22 66 72 6f 6d 53  aram name="fromS
1e070 79 6d 62 6f 6c 22 3e 3c 2f 70 61 72 61 6d 3e 0d  ymbol"></param>.
1e080 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
1e090 6e 61 6d 65 3d 22 61 64 64 54 6f 53 79 6d 62 6f  name="addToSymbo
1e0a0 6c 54 61 62 6c 65 22 3e 3c 2f 70 61 72 61 6d 3e  lTable"></param>
1e0b0 0d 0a 20 20 20 20 76 6f 69 64 20 41 64 64 46 72  ..    void AddFr
1e0c0 6f 6d 53 79 6d 62 6f 6c 28 53 71 6c 53 65 6c 65  omSymbol(SqlSele
1e0d0 63 74 53 74 61 74 65 6d 65 6e 74 20 73 65 6c 65  ctStatement sele
1e0e0 63 74 53 74 61 74 65 6d 65 6e 74 2c 20 73 74 72  ctStatement, str
1e0f0 69 6e 67 20 69 6e 70 75 74 56 61 72 4e 61 6d 65  ing inputVarName
1e100 2c 20 53 79 6d 62 6f 6c 20 66 72 6f 6d 53 79 6d  , Symbol fromSym
1e110 62 6f 6c 2c 20 62 6f 6f 6c 20 61 64 64 54 6f 53  bol, bool addToS
1e120 79 6d 62 6f 6c 54 61 62 6c 65 29 0d 0a 20 20 20  ymbolTable)..   
1e130 20 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 74 68 65   {..      // the
1e140 20 66 69 72 73 74 20 63 68 65 63 6b 20 69 73 20   first check is 
1e150 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
1e160 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 0d  a new statement.
1e170 0a 20 20 20 20 20 20 2f 2f 20 74 68 65 20 73 65  .      // the se
1e180 63 6f 6e 64 20 63 68 65 63 6b 20 69 73 20 74 72  cond check is tr
1e190 75 65 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  ue if we are in 
1e1a0 61 20 6a 6f 69 6e 20 2d 20 77 65 20 64 6f 20 6e  a join - we do n
1e1b0 6f 74 0d 0a 20 20 20 20 20 20 2f 2f 20 63 68 65  ot..      // che
1e1c0 63 6b 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  ck if we are in 
1e1d0 61 20 6a 6f 69 6e 20 63 6f 6e 74 65 78 74 2e 0d  a join context..
1e1e0 0a 20 20 20 20 20 20 2f 2f 20 57 65 20 64 6f 20  .      // We do 
1e1f0 6e 6f 74 20 77 61 6e 74 20 74 6f 20 61 64 64 20  not want to add 
1e200 22 41 53 20 61 6c 69 61 73 22 20 69 66 20 69 74  "AS alias" if it
1e210 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 61   has been done a
1e220 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 2f 2f  lready..      //
1e230 20 65 2e 67 2e 20 77 68 65 6e 20 77 65 20 61 72   e.g. when we ar
1e240 65 20 72 65 75 73 69 6e 67 20 74 68 65 20 53 71  e reusing the Sq
1e250 6c 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20  l statement...  
1e260 20 20 20 20 69 66 20 28 73 65 6c 65 63 74 53 74      if (selectSt
1e270 61 74 65 6d 65 6e 74 2e 46 72 6f 6d 45 78 74 65  atement.FromExte
1e280 6e 74 73 2e 43 6f 75 6e 74 20 3d 3d 20 30 20 7c  nts.Count == 0 |
1e290 7c 20 66 72 6f 6d 53 79 6d 62 6f 6c 20 21 3d 20  | fromSymbol != 
1e2a0 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 2e  selectStatement.
1e2b0 46 72 6f 6d 45 78 74 65 6e 74 73 5b 30 5d 29 0d  FromExtents[0]).
1e2c0 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
1e2d0 20 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e    selectStatemen
1e2e0 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73 2e 41 64  t.FromExtents.Ad
1e2f0 64 28 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a  d(fromSymbol);..
1e300 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 53 74          selectSt
1e310 61 74 65 6d 65 6e 74 2e 46 72 6f 6d 2e 41 70 70  atement.From.App
1e320 65 6e 64 28 22 20 41 53 20 22 29 3b 0d 0a 20 20  end(" AS ");..  
1e330 20 20 20 20 20 20 73 65 6c 65 63 74 53 74 61 74        selectStat
1e340 65 6d 65 6e 74 2e 46 72 6f 6d 2e 41 70 70 65 6e  ement.From.Appen
1e350 64 28 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a  d(fromSymbol);..
1e360 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 57 65 20  ..        // We 
1e370 68 61 76 65 20 74 68 69 73 20 69 6e 73 69 64 65  have this inside
1e380 20 74 68 65 20 69 66 20 73 74 61 74 65 6d 65 6e   the if statemen
1e390 74 2c 20 73 69 6e 63 65 0d 0a 20 20 20 20 20 20  t, since..      
1e3a0 20 20 2f 2f 20 77 65 20 6f 6e 6c 79 20 77 61 6e    // we only wan
1e3b0 74 20 74 6f 20 61 64 64 20 65 78 74 65 6e 74 73  t to add extents
1e3c0 20 74 68 61 74 20 61 72 65 20 61 63 74 75 61 6c   that are actual
1e3d0 6c 79 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20  ly used...      
1e3e0 20 20 61 6c 6c 45 78 74 65 6e 74 4e 61 6d 65 73    allExtentNames
1e3f0 5b 66 72 6f 6d 53 79 6d 62 6f 6c 2e 4e 61 6d 65  [fromSymbol.Name
1e400 5d 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d  ] = 0;..      }.
1e410 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 61 64 64  ...      if (add
1e420 54 6f 53 79 6d 62 6f 6c 54 61 62 6c 65 29 0d 0a  ToSymbolTable)..
1e430 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1e440 20 73 79 6d 62 6f 6c 54 61 62 6c 65 2e 41 64 64   symbolTable.Add
1e450 28 69 6e 70 75 74 56 61 72 4e 61 6d 65 2c 20 66  (inputVarName, f
1e460 72 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20  romSymbol);..   
1e470 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
1e480 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
1e490 0d 0a 20 20 20 20 2f 2f 2f 20 54 72 61 6e 73 6c  ..    /// Transl
1e4a0 61 74 65 73 20 61 20 6c 69 73 74 20 6f 66 20 53  ates a list of S
1e4b0 6f 72 74 43 6c 61 75 73 65 73 2e 0d 0a 20 20 20  ortClauses...   
1e4c0 20 2f 2f 2f 20 55 73 65 64 20 69 6e 20 74 68 65   /// Used in the
1e4d0 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 66 20   translation of 
1e4e0 4f 72 64 65 72 42 79 0d 0a 20 20 20 20 2f 2f 2f  OrderBy..    ///
1e4f0 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
1e500 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
1e510 3d 22 6f 72 64 65 72 42 79 43 6c 61 75 73 65 22  ="orderByClause"
1e520 3e 54 68 65 20 53 71 6c 42 75 69 6c 64 65 72 20  >The SqlBuilder 
1e530 74 6f 20 77 68 69 63 68 20 74 68 65 20 73 6f 72  to which the sor
1e540 74 20 6b 65 79 73 20 73 68 6f 75 6c 64 20 62 65  t keys should be
1e550 20 61 70 70 65 6e 64 65 64 3c 2f 70 61 72 61 6d   appended</param
1e560 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
1e570 6d 20 6e 61 6d 65 3d 22 73 6f 72 74 4b 65 79 73  m name="sortKeys
1e580 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  "></param>..    
1e590 76 6f 69 64 20 41 64 64 53 6f 72 74 4b 65 79 73  void AddSortKeys
1e5a0 28 53 71 6c 42 75 69 6c 64 65 72 20 6f 72 64 65  (SqlBuilder orde
1e5b0 72 42 79 43 6c 61 75 73 65 2c 20 49 4c 69 73 74  rByClause, IList
1e5c0 3c 44 62 53 6f 72 74 43 6c 61 75 73 65 3e 20 73  <DbSortClause> s
1e5d0 6f 72 74 4b 65 79 73 29 0d 0a 20 20 20 20 7b 0d  ortKeys)..    {.
1e5e0 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 65  .      string se
1e5f0 70 61 72 61 74 6f 72 20 3d 20 53 74 72 69 6e 67  parator = String
1e600 2e 45 6d 70 74 79 3b 0d 0a 20 20 20 20 20 20 66  .Empty;..      f
1e610 6f 72 65 61 63 68 20 28 44 62 53 6f 72 74 43 6c  oreach (DbSortCl
1e620 61 75 73 65 20 73 6f 72 74 43 6c 61 75 73 65 20  ause sortClause 
1e630 69 6e 20 73 6f 72 74 4b 65 79 73 29 0d 0a 20 20  in sortKeys)..  
1e640 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f      {..        o
1e650 72 64 65 72 42 79 43 6c 61 75 73 65 2e 41 70 70  rderByClause.App
1e660 65 6e 64 28 73 65 70 61 72 61 74 6f 72 29 3b 0d  end(separator);.
1e670 0a 20 20 20 20 20 20 20 20 6f 72 64 65 72 42 79  .        orderBy
1e680 43 6c 61 75 73 65 2e 41 70 70 65 6e 64 28 73 6f  Clause.Append(so
1e690 72 74 43 6c 61 75 73 65 2e 45 78 70 72 65 73 73  rtClause.Express
1e6a0 69 6f 6e 2e 41 63 63 65 70 74 28 74 68 69 73 29  ion.Accept(this)
1e6b0 29 3b 0d 0a 20 20 20 20 20 20 20 20 44 65 62 75  );..        Debu
1e6c0 67 2e 41 73 73 65 72 74 28 73 6f 72 74 43 6c 61  g.Assert(sortCla
1e6d0 75 73 65 2e 43 6f 6c 6c 61 74 69 6f 6e 20 21 3d  use.Collation !=
1e6e0 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20 20 20 20   null);..       
1e6f0 20 69 66 20 28 21 53 74 72 69 6e 67 2e 49 73 4e   if (!String.IsN
1e700 75 6c 6c 4f 72 45 6d 70 74 79 28 73 6f 72 74 43  ullOrEmpty(sortC
1e710 6c 61 75 73 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29  lause.Collation)
1e720 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
1e730 20 20 20 20 20 20 20 20 6f 72 64 65 72 42 79 43          orderByC
1e740 6c 61 75 73 65 2e 41 70 70 65 6e 64 28 22 20 43  lause.Append(" C
1e750 4f 4c 4c 41 54 45 20 22 29 3b 0d 0a 20 20 20 20  OLLATE ");..    
1e760 20 20 20 20 20 20 6f 72 64 65 72 42 79 43 6c 61        orderByCla
1e770 75 73 65 2e 41 70 70 65 6e 64 28 73 6f 72 74 43  use.Append(sortC
1e780 6c 61 75 73 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29  lause.Collation)
1e790 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ;..        }....
1e7a0 20 20 20 20 20 20 20 20 6f 72 64 65 72 42 79 43          orderByC
1e7b0 6c 61 75 73 65 2e 41 70 70 65 6e 64 28 73 6f 72  lause.Append(sor
1e7c0 74 43 6c 61 75 73 65 2e 41 73 63 65 6e 64 69 6e  tClause.Ascendin
1e7d0 67 20 3f 20 22 20 41 53 43 22 20 3a 20 22 20 44  g ? " ASC" : " D
1e7e0 45 53 43 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ESC");....      
1e7f0 20 20 73 65 70 61 72 61 74 6f 72 20 3d 20 22 2c    separator = ",
1e800 20 22 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ";..      }..  
1e810 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
1e820 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
1e830 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 43 72 65  / <see cref="Cre
1e840 61 74 65 4e 65 77 53 65 6c 65 63 74 53 74 61 74  ateNewSelectStat
1e850 65 6d 65 6e 74 28 53 71 6c 53 65 6c 65 63 74 53  ement(SqlSelectS
1e860 74 61 74 65 6d 65 6e 74 2c 20 73 74 72 69 6e 67  tatement, string
1e870 2c 20 54 79 70 65 55 73 61 67 65 2c 20 62 6f 6f  , TypeUsage, boo
1e880 6c 2c 20 6f 75 74 20 53 79 6d 62 6f 6c 29 20 22  l, out Symbol) "
1e890 20 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73   />..    /// </s
1e8a0 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
1e8b0 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6f 6c   <param name="ol
1e8c0 64 53 74 61 74 65 6d 65 6e 74 22 3e 3c 2f 70 61  dStatement"></pa
1e8d0 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
1e8e0 61 72 61 6d 20 6e 61 6d 65 3d 22 69 6e 70 75 74  aram name="input
1e8f0 56 61 72 4e 61 6d 65 22 3e 3c 2f 70 61 72 61 6d  VarName"></param
1e900 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
1e910 6d 20 6e 61 6d 65 3d 22 69 6e 70 75 74 56 61 72  m name="inputVar
1e920 54 79 70 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  Type"></param>..
1e930 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
1e940 61 6d 65 3d 22 66 72 6f 6d 53 79 6d 62 6f 6c 22  ame="fromSymbol"
1e950 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  ></param>..    /
1e960 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 41 20 6e 65  // <returns>A ne
1e970 77 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  w select stateme
1e980 6e 74 2c 20 77 69 74 68 20 74 68 65 20 6f 6c 64  nt, with the old
1e990 20 6f 6e 65 20 61 73 20 74 68 65 20 66 72 6f 6d   one as the from
1e9a0 20 63 6c 61 75 73 65 2e 3c 2f 72 65 74 75 72 6e   clause.</return
1e9b0 73 3e 0d 0a 20 20 20 20 53 71 6c 53 65 6c 65 63  s>..    SqlSelec
1e9c0 74 53 74 61 74 65 6d 65 6e 74 20 43 72 65 61 74  tStatement Creat
1e9d0 65 4e 65 77 53 65 6c 65 63 74 53 74 61 74 65 6d  eNewSelectStatem
1e9e0 65 6e 74 28 53 71 6c 53 65 6c 65 63 74 53 74 61  ent(SqlSelectSta
1e9f0 74 65 6d 65 6e 74 20 6f 6c 64 53 74 61 74 65 6d  tement oldStatem
1ea00 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 73 74  ent,..        st
1ea10 72 69 6e 67 20 69 6e 70 75 74 56 61 72 4e 61 6d  ring inputVarNam
1ea20 65 2c 20 54 79 70 65 55 73 61 67 65 20 69 6e 70  e, TypeUsage inp
1ea30 75 74 56 61 72 54 79 70 65 2c 20 6f 75 74 20 53  utVarType, out S
1ea40 79 6d 62 6f 6c 20 66 72 6f 6d 53 79 6d 62 6f 6c  ymbol fromSymbol
1ea50 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
1ea60 72 65 74 75 72 6e 20 43 72 65 61 74 65 4e 65 77  return CreateNew
1ea70 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 28  SelectStatement(
1ea80 6f 6c 64 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  oldStatement, in
1ea90 70 75 74 56 61 72 4e 61 6d 65 2c 20 69 6e 70 75  putVarName, inpu
1eaa0 74 56 61 72 54 79 70 65 2c 20 74 72 75 65 2c 20  tVarType, true, 
1eab0 6f 75 74 20 66 72 6f 6d 53 79 6d 62 6f 6c 29 3b  out fromSymbol);
1eac0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 0d 0a 20 20 20  ..    }......   
1ead0 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
1eae0 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20      /// This is 
1eaf0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
1eb00 65 6c 61 74 69 6f 6e 61 6c 20 6e 6f 64 65 27 73  elational node's
1eb10 20 69 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20   input has been 
1eb20 76 69 73 69 74 65 64 2c 20 61 6e 64 20 74 68 65  visited, and the
1eb30 0d 0a 20 20 20 20 2f 2f 2f 20 69 6e 70 75 74 27  ..    /// input'
1eb40 73 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  s sql statement 
1eb50 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64  cannot be reused
1eb60 2e 20 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69  .  <see cref="Vi
1eb70 73 69 74 28 44 62 50 72 6f 6a 65 63 74 45 78 70  sit(DbProjectExp
1eb80 72 65 73 73 69 6f 6e 29 22 2f 3e 0d 0a 20 20 20  ression)"/>..   
1eb90 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 57 68   ///..    /// Wh
1eba0 65 6e 20 74 68 65 20 69 6e 70 75 74 27 73 20 73  en the input's s
1ebb0 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  ql statement can
1ebc0 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2c 20 77  not be reused, w
1ebd0 65 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73  e create a new s
1ebe0 71 6c 0d 0a 20 20 20 20 2f 2f 2f 20 73 74 61 74  ql..    /// stat
1ebf0 65 6d 65 6e 74 2c 20 77 69 74 68 20 74 68 65 20  ement, with the 
1ec00 6f 6c 64 20 6f 6e 65 20 61 73 20 74 68 65 20 66  old one as the f
1ec10 72 6f 6d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  rom clause of th
1ec20 65 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e  e new statement.
1ec30 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f  ..    ///..    /
1ec40 2f 2f 20 54 68 65 20 6f 6c 64 20 73 74 61 74 65  // The old state
1ec50 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 63 6f 6d  ment must be com
1ec60 70 6c 65 74 65 64 20 69 2e 65 2e 20 69 66 20 69  pleted i.e. if i
1ec70 74 20 68 61 73 20 61 6e 20 65 6d 70 74 79 20 73  t has an empty s
1ec80 65 6c 65 63 74 20 6c 69 73 74 2c 0d 0a 20 20 20  elect list,..   
1ec90 20 2f 2f 2f 20 74 68 65 20 6c 69 73 74 20 6f 66   /// the list of
1eca0 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
1ecb0 20 70 72 6f 6a 65 63 74 65 64 20 6f 75 74 2e 0d   projected out..
1ecc0 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f  .    ///..    //
1ecd0 2f 20 49 66 20 74 68 65 20 6f 6c 64 20 73 74 61  / If the old sta
1ece0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 6d  tement being com
1ecf0 70 6c 65 74 65 64 20 68 61 73 20 61 20 6a 6f 69  pleted has a joi
1ed00 6e 20 73 79 6d 62 6f 6c 20 61 73 20 69 74 73 20  n symbol as its 
1ed10 66 72 6f 6d 20 65 78 74 65 6e 74 2c 0d 0a 20 20  from extent,..  
1ed20 20 20 2f 2f 2f 20 74 68 65 20 6e 65 77 20 73 74    /// the new st
1ed30 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 68 61 76  atement must hav
1ed40 65 20 61 20 63 6c 6f 6e 65 20 6f 66 20 74 68 65  e a clone of the
1ed50 20 6a 6f 69 6e 20 73 79 6d 62 6f 6c 20 61 73 20   join symbol as 
1ed60 69 74 73 20 65 78 74 65 6e 74 2e 0d 0a 20 20 20  its extent...   
1ed70 20 2f 2f 2f 20 57 65 20 63 61 6e 6e 6f 74 20 72   /// We cannot r
1ed80 65 75 73 65 20 74 68 65 20 6f 6c 64 20 73 79 6d  euse the old sym
1ed90 62 6f 6c 2c 20 62 75 74 20 74 68 65 20 6e 65 77  bol, but the new
1eda0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1edb0 74 20 6d 75 73 74 20 62 65 68 61 76 65 0d 0a 20  t must behave.. 
1edc0 20 20 20 2f 2f 2f 20 61 73 20 74 68 6f 75 67 68     /// as though
1edd0 20 69 74 20 69 73 20 77 6f 72 6b 69 6e 67 20 6f   it is working o
1ede0 76 65 72 20 74 68 65 20 22 6a 6f 69 6e 22 20 72  ver the "join" r
1edf0 65 63 6f 72 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ecord...    /// 
1ee00 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
1ee10 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1ee20 22 6f 6c 64 53 74 61 74 65 6d 65 6e 74 22 3e 3c  "oldStatement"><
1ee30 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
1ee40 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 6e   <param name="in
1ee50 70 75 74 56 61 72 4e 61 6d 65 22 3e 3c 2f 70 61  putVarName"></pa
1ee60 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
1ee70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 6e 70 75 74  aram name="input
1ee80 56 61 72 54 79 70 65 22 3e 3c 2f 70 61 72 61 6d  VarType"></param
1ee90 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
1eea0 6d 20 6e 61 6d 65 3d 22 66 69 6e 61 6c 69 7a 65  m name="finalize
1eeb0 4f 6c 64 53 74 61 74 65 6d 65 6e 74 22 3e 3c 2f  OldStatement"></
1eec0 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
1eed0 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 66 72 6f  <param name="fro
1eee0 6d 53 79 6d 62 6f 6c 22 3e 3c 2f 70 61 72 61 6d  mSymbol"></param
1eef0 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
1ef00 72 6e 73 3e 41 20 6e 65 77 20 73 65 6c 65 63 74  rns>A new select
1ef10 20 73 74 61 74 65 6d 65 6e 74 2c 20 77 69 74 68   statement, with
1ef20 20 74 68 65 20 6f 6c 64 20 6f 6e 65 20 61 73 20   the old one as 
1ef30 74 68 65 20 66 72 6f 6d 20 63 6c 61 75 73 65 2e  the from clause.
1ef40 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
1ef50 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d 65  SqlSelectStateme
1ef60 6e 74 20 43 72 65 61 74 65 4e 65 77 53 65 6c 65  nt CreateNewSele
1ef70 63 74 53 74 61 74 65 6d 65 6e 74 28 53 71 6c 53  ctStatement(SqlS
1ef80 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 20 6f  electStatement o
1ef90 6c 64 53 74 61 74 65 6d 65 6e 74 2c 0d 0a 20 20  ldStatement,..  
1efa0 20 20 20 20 20 20 73 74 72 69 6e 67 20 69 6e 70        string inp
1efb0 75 74 56 61 72 4e 61 6d 65 2c 20 54 79 70 65 55  utVarName, TypeU
1efc0 73 61 67 65 20 69 6e 70 75 74 56 61 72 54 79 70  sage inputVarTyp
1efd0 65 2c 20 62 6f 6f 6c 20 66 69 6e 61 6c 69 7a 65  e, bool finalize
1efe0 4f 6c 64 53 74 61 74 65 6d 65 6e 74 2c 20 6f 75  OldStatement, ou
1eff0 74 20 53 79 6d 62 6f 6c 20 66 72 6f 6d 53 79 6d  t Symbol fromSym
1f000 62 6f 6c 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  bol)..    {..   
1f010 20 20 20 66 72 6f 6d 53 79 6d 62 6f 6c 20 3d 20     fromSymbol = 
1f020 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f  null;....      /
1f030 2f 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6f  / Finalize the o
1f040 6c 64 20 73 74 61 74 65 6d 65 6e 74 0d 0a 20 20  ld statement..  
1f050 20 20 20 20 69 66 20 28 66 69 6e 61 6c 69 7a 65      if (finalize
1f060 4f 6c 64 53 74 61 74 65 6d 65 6e 74 20 26 26 20  OldStatement && 
1f070 6f 6c 64 53 74 61 74 65 6d 65 6e 74 2e 53 65 6c  oldStatement.Sel
1f080 65 63 74 2e 49 73 45 6d 70 74 79 29 0d 0a 20 20  ect.IsEmpty)..  
1f090 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 4c      {..        L
1f0a0 69 73 74 3c 53 79 6d 62 6f 6c 3e 20 63 6f 6c 75  ist<Symbol> colu
1f0b0 6d 6e 73 20 3d 20 41 64 64 44 65 66 61 75 6c 74  mns = AddDefault
1f0c0 43 6f 6c 75 6d 6e 73 28 6f 6c 64 53 74 61 74 65  Columns(oldState
1f0d0 6d 65 6e 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ment);....      
1f0e0 20 20 2f 2f 20 54 68 69 64 20 63 6f 75 6c 64 20    // Thid could 
1f0f0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 63 61  not have been ca
1f100 6c 6c 65 64 20 66 72 6f 6d 20 61 20 6a 6f 69 6e  lled from a join
1f110 20 6e 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   node...        
1f120 44 65 62 75 67 2e 41 73 73 65 72 74 28 6f 6c 64  Debug.Assert(old
1f130 53 74 61 74 65 6d 65 6e 74 2e 46 72 6f 6d 45 78  Statement.FromEx
1f140 74 65 6e 74 73 2e 43 6f 75 6e 74 20 3d 3d 20 31  tents.Count == 1
1f150 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  );....        //
1f160 20 69 66 20 74 68 65 20 6f 6c 64 53 74 61 74 65   if the oldState
1f170 6d 65 6e 74 20 68 61 73 20 61 20 6a 6f 69 6e 20  ment has a join 
1f180 61 73 20 69 74 73 20 69 6e 70 75 74 2c 20 2e 2e  as its input, ..
1f190 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 63 6c  ...        // cl
1f1a0 6f 6e 65 20 74 68 65 20 6a 6f 69 6e 20 73 79 6d  one the join sym
1f1b0 62 6f 6c 2c 20 73 6f 20 74 68 61 74 20 77 65 20  bol, so that we 
1f1c0 22 72 65 75 73 65 22 20 74 68 65 0d 0a 20 20 20  "reuse" the..   
1f1d0 20 20 20 20 20 2f 2f 20 6a 6f 69 6e 20 73 79 6d       // join sym
1f1e0 62 6f 6c 2e 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20  bol.  Normally, 
1f1f0 77 65 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  we create a new 
1f200 73 79 6d 62 6f 6c 20 2d 20 73 65 65 20 74 68 65  symbol - see the
1f210 20 6e 65 78 74 20 62 6c 6f 63 6b 0d 0a 20 20 20   next block..   
1f220 20 20 20 20 20 2f 2f 20 6f 66 20 63 6f 64 65 2e       // of code.
1f230 0d 0a 20 20 20 20 20 20 20 20 4a 6f 69 6e 53 79  ..        JoinSy
1f240 6d 62 6f 6c 20 6f 6c 64 4a 6f 69 6e 53 79 6d 62  mbol oldJoinSymb
1f250 6f 6c 20 3d 20 6f 6c 64 53 74 61 74 65 6d 65 6e  ol = oldStatemen
1f260 74 2e 46 72 6f 6d 45 78 74 65 6e 74 73 5b 30 5d  t.FromExtents[0]
1f270 20 61 73 20 4a 6f 69 6e 53 79 6d 62 6f 6c 3b 0d   as JoinSymbol;.
1f280 0a 20 20 20 20 20 20 20 20 69 66 20 28 6f 6c 64  .        if (old
1f290 4a 6f 69 6e 53 79 6d 62 6f 6c 20 21 3d 20 6e 75  JoinSymbol != nu
1f2a0 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ll)..        {..
1f2b0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f 74            // Not
1f2c0 65 3a 20 6f 6c 64 53 74 61 74 65 6d 65 6e 74 2e  e: oldStatement.
1f2d0 46 72 6f 6d 45 78 74 65 6e 74 73 20 77 69 6c 6c  FromExtents will
1f2e0 20 6e 6f 74 20 64 6f 2c 20 73 69 6e 63 65 20 69   not do, since i
1f2f0 74 20 6d 69 67 68 74 0d 0a 20 20 20 20 20 20 20  t might..       
1f300 20 20 20 2f 2f 20 6a 75 73 74 20 62 65 20 61 6e     // just be an
1f310 20 61 6c 69 61 73 20 6f 66 20 6a 6f 69 6e 53 79   alias of joinSy
1f320 6d 62 6f 6c 2c 20 61 6e 64 20 77 65 20 77 61 6e  mbol, and we wan
1f330 74 20 61 6e 20 61 63 74 75 61 6c 20 4a 6f 69 6e  t an actual Join
1f340 53 79 6d 62 6f 6c 2e 0d 0a 20 20 20 20 20 20 20  Symbol...       
1f350 20 20 20 4a 6f 69 6e 53 79 6d 62 6f 6c 20 6e 65     JoinSymbol ne
1f360 77 4a 6f 69 6e 53 79 6d 62 6f 6c 20 3d 20 6e 65  wJoinSymbol = ne
1f370 77 20 4a 6f 69 6e 53 79 6d 62 6f 6c 28 69 6e 70  w JoinSymbol(inp
1f380 75 74 56 61 72 4e 61 6d 65 2c 20 69 6e 70 75 74  utVarName, input
1f390 56 61 72 54 79 70 65 2c 20 6f 6c 64 4a 6f 69 6e  VarType, oldJoin
1f3a0 53 79 6d 62 6f 6c 2e 45 78 74 65 6e 74 4c 69 73  Symbol.ExtentLis
1f3b0 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f  t);..          /
1f3c0 2f 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  / This indicates
1f3d0 20 74 68 61 74 20 74 68 65 20 6f 6c 64 53 74 61   that the oldSta
1f3e0 74 65 6d 65 6e 74 20 69 73 20 61 20 62 6c 6f 63  tement is a bloc
1f3f0 6b 69 6e 67 20 73 63 6f 70 65 0d 0a 20 20 20 20  king scope..    
1f400 20 20 20 20 20 20 2f 2f 20 69 2e 65 2e 20 69 74        // i.e. it
1f410 20 68 69 64 65 73 2f 72 65 6e 61 6d 65 73 20 65   hides/renames e
1f420 78 74 65 6e 74 20 63 6f 6c 75 6d 6e 73 0d 0a 20  xtent columns.. 
1f430 20 20 20 20 20 20 20 20 20 6e 65 77 4a 6f 69 6e           newJoin
1f440 53 79 6d 62 6f 6c 2e 49 73 4e 65 73 74 65 64 4a  Symbol.IsNestedJ
1f450 6f 69 6e 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20  oin = true;..   
1f460 20 20 20 20 20 20 20 6e 65 77 4a 6f 69 6e 53 79         newJoinSy
1f470 6d 62 6f 6c 2e 43 6f 6c 75 6d 6e 4c 69 73 74 20  mbol.ColumnList 
1f480 3d 20 63 6f 6c 75 6d 6e 73 3b 0d 0a 20 20 20 20  = columns;..    
1f490 20 20 20 20 20 20 6e 65 77 4a 6f 69 6e 53 79 6d        newJoinSym
1f4a0 62 6f 6c 2e 46 6c 61 74 74 65 6e 65 64 45 78 74  bol.FlattenedExt
1f4b0 65 6e 74 4c 69 73 74 20 3d 20 6f 6c 64 4a 6f 69  entList = oldJoi
1f4c0 6e 53 79 6d 62 6f 6c 2e 46 6c 61 74 74 65 6e 65  nSymbol.Flattene
1f4d0 64 45 78 74 65 6e 74 4c 69 73 74 3b 0d 0a 0d 0a  dExtentList;....
1f4e0 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 53 79            fromSy
1f4f0 6d 62 6f 6c 20 3d 20 6e 65 77 4a 6f 69 6e 53 79  mbol = newJoinSy
1f500 6d 62 6f 6c 3b 0d 0a 20 20 20 20 20 20 20 20 7d  mbol;..        }
1f510 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1f520 20 20 20 69 66 20 28 66 72 6f 6d 53 79 6d 62 6f     if (fromSymbo
1f530 6c 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  l == null)..    
1f540 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20    {..        // 
1f550 54 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  This is just a s
1f560 69 6d 70 6c 65 20 65 78 74 65 6e 74 2f 53 71 6c  imple extent/Sql
1f570 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 2c  SelectStatement,
1f580 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 6e 64  ..        // and
1f590 20 77 65 20 63 61 6e 20 67 65 74 20 74 68 65 20   we can get the 
1f5a0 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 66 72 6f 6d  column list from
1f5b0 20 74 68 65 20 74 79 70 65 2e 0d 0a 20 20 20 20   the type...    
1f5c0 20 20 20 20 66 72 6f 6d 53 79 6d 62 6f 6c 20 3d      fromSymbol =
1f5d0 20 6e 65 77 20 53 79 6d 62 6f 6c 28 69 6e 70 75   new Symbol(inpu
1f5e0 74 56 61 72 4e 61 6d 65 2c 20 69 6e 70 75 74 56  tVarName, inputV
1f5f0 61 72 54 79 70 65 29 3b 0d 0a 20 20 20 20 20 20  arType);..      
1f600 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 4f 62  }....      // Ob
1f610 73 65 72 76 65 20 74 68 61 74 20 74 68 65 20 66  serve that the f
1f620 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 6b 73 20 6c  ollowing looks l
1f630 69 6b 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20  ike the body of 
1f640 56 69 73 69 74 28 45 78 74 65 6e 74 45 78 70 72  Visit(ExtentExpr
1f650 65 73 73 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20  ession)...      
1f660 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d 65  SqlSelectStateme
1f670 6e 74 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65  nt selectStateme
1f680 6e 74 20 3d 20 6e 65 77 20 53 71 6c 53 65 6c 65  nt = new SqlSele
1f690 63 74 53 74 61 74 65 6d 65 6e 74 28 29 3b 0d 0a  ctStatement();..
1f6a0 20 20 20 20 20 20 73 65 6c 65 63 74 53 74 61 74        selectStat
1f6b0 65 6d 65 6e 74 2e 46 72 6f 6d 2e 41 70 70 65 6e  ement.From.Appen
1f6c0 64 28 22 28 20 22 29 3b 0d 0a 20 20 20 20 20 20  d("( ");..      
1f6d0 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 2e  selectStatement.
1f6e0 46 72 6f 6d 2e 41 70 70 65 6e 64 28 6f 6c 64 53  From.Append(oldS
1f6f0 74 61 74 65 6d 65 6e 74 29 3b 0d 0a 20 20 20 20  tatement);..    
1f700 20 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e    selectStatemen
1f710 74 2e 46 72 6f 6d 2e 41 70 70 65 6e 64 4c 69 6e  t.From.AppendLin
1f720 65 28 29 3b 0d 0a 20 20 20 20 20 20 73 65 6c 65  e();..      sele
1f730 63 74 53 74 61 74 65 6d 65 6e 74 2e 46 72 6f 6d  ctStatement.From
1f740 2e 41 70 70 65 6e 64 28 22 29 20 22 29 3b 0d 0a  .Append(") ");..
1f750 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
1f760 20 73 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74   selectStatement
1f770 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
1f780 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
1f790 20 20 20 2f 2f 2f 20 44 65 74 65 72 6d 69 6e 65     /// Determine
1f7a0 73 20 69 66 20 76 61 6c 75 65 73 20 6f 66 20 74  s if values of t
1f7b0 68 65 20 73 70 65 63 69 66 69 65 64 20 3c 73 65  he specified <se
1f7c0 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 44 61  e cref="SQLiteDa
1f7d0 74 65 46 6f 72 6d 61 74 73 22 20 2f 3e 0d 0a 20  teFormats" />.. 
1f7e0 20 20 20 2f 2f 2f 20 72 65 71 75 69 72 65 20 77     /// require w
1f7f0 72 61 70 70 69 6e 67 20 69 6e 20 73 69 6e 67 6c  rapping in singl
1f800 65 20 71 75 6f 74 65 73 2e 0d 0a 20 20 20 20 2f  e quotes...    /
1f810 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
1f820 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
1f830 6d 65 3d 22 66 6f 72 6d 61 74 22 3e 0d 0a 20 20  me="format">..  
1f840 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20 63    /// The <see c
1f850 72 65 66 3d 22 53 51 4c 69 74 65 44 61 74 65 46  ref="SQLiteDateF
1f860 6f 72 6d 61 74 73 22 20 2f 3e 20 66 6f 72 6d 61  ormats" /> forma
1f870 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  t...    /// </pa
1f880 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
1f890 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 2f 2f 2f  eturns>..    ///
1f8a0 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 73 69 6e   Non-zero if sin
1f8b0 67 6c 65 20 71 75 6f 74 65 73 20 61 72 65 20 72  gle quotes are r
1f8c0 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 76 61  equired for a va
1f8d0 6c 75 65 20 69 6e 20 74 68 65 20 73 70 65 63 69  lue in the speci
1f8e0 66 69 65 64 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  fied..    /// <s
1f8f0 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 44  ee cref="SQLiteD
1f900 61 74 65 46 6f 72 6d 61 74 73 22 20 2f 3e 2e 0d  ateFormats" />..
1f910 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72  .    /// </retur
1f920 6e 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65  ns>..    private
1f930 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 4e 65 65   static bool Nee
1f940 64 53 69 6e 67 6c 65 51 75 6f 74 65 73 28 0d 0a  dSingleQuotes(..
1f950 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 44 61          SQLiteDa
1f960 74 65 46 6f 72 6d 61 74 73 20 66 6f 72 6d 61 74  teFormats format
1f970 0d 0a 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20  ..        )..   
1f980 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
1f990 72 6e 20 66 6f 72 6d 61 74 20 21 3d 20 53 51 4c  rn format != SQL
1f9a0 69 74 65 44 61 74 65 46 6f 72 6d 61 74 73 2e 54  iteDateFormats.T
1f9b0 69 63 6b 73 20 26 26 0d 0a 20 20 20 20 20 20 20  icks &&..       
1f9c0 20 20 20 20 20 66 6f 72 6d 61 74 20 21 3d 20 53       format != S
1f9d0 51 4c 69 74 65 44 61 74 65 46 6f 72 6d 61 74 73  QLiteDateFormats
1f9e0 2e 4a 75 6c 69 61 6e 44 61 79 20 26 26 0d 0a 20  .JulianDay &&.. 
1f9f0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 6d 61             forma
1fa00 74 20 21 3d 20 53 51 4c 69 74 65 44 61 74 65 46  t != SQLiteDateF
1fa10 6f 72 6d 61 74 73 2e 55 6e 69 78 45 70 6f 63 68  ormats.UnixEpoch
1fa20 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
1fa30 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
1fa40 20 20 20 2f 2f 2f 20 42 65 66 6f 72 65 20 77 65     /// Before we
1fa50 20 65 6d 62 65 64 20 61 20 73 74 72 69 6e 67 20   embed a string 
1fa60 6c 69 74 65 72 61 6c 20 69 6e 20 61 20 53 51 4c  literal in a SQL
1fa70 20 73 74 72 69 6e 67 2c 20 77 65 20 73 68 6f 75   string, we shou
1fa80 6c 64 0d 0a 20 20 20 20 2f 2f 2f 20 63 6f 6e 76  ld..    /// conv
1fa90 65 72 74 20 61 6c 6c 20 27 20 74 6f 20 27 27 2c  ert all ' to '',
1faa0 20 61 6e 64 20 65 6e 63 6c 6f 73 65 20 74 68 65   and enclose the
1fab0 20 77 68 6f 6c 65 20 73 74 72 69 6e 67 20 69 6e   whole string in
1fac0 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 2e 0d   single quotes..
1fad0 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
1fae0 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
1faf0 72 61 6d 20 6e 61 6d 65 3d 22 73 22 3e 3c 2f 70  ram name="s"></p
1fb00 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
1fb10 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 73 55 6e  param name="isUn
1fb20 69 63 6f 64 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  icode"></param>.
1fb30 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
1fb40 73 3e 54 68 65 20 65 73 63 61 70 65 64 20 73 71  s>The escaped sq
1fb50 6c 20 73 74 72 69 6e 67 2e 3c 2f 72 65 74 75 72  l string.</retur
1fb60 6e 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65  ns>..    private
1fb70 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 45   static string E
1fb80 73 63 61 70 65 53 69 6e 67 6c 65 51 75 6f 74 65  scapeSingleQuote
1fb90 28 73 74 72 69 6e 67 20 73 2c 20 62 6f 6f 6c 20  (string s, bool 
1fba0 69 73 55 6e 69 63 6f 64 65 29 0d 0a 20 20 20 20  isUnicode)..    
1fbb0 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
1fbc0 22 27 22 20 2b 20 73 2e 52 65 70 6c 61 63 65 28  "'" + s.Replace(
1fbd0 22 27 22 2c 20 22 27 27 22 29 20 2b 20 22 27 22  "'", "''") + "'"
1fbe0 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
1fbf0 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
1fc00 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 74     /// Returns t
1fc10 68 65 20 73 71 6c 20 70 72 69 6d 69 74 69 76 65  he sql primitive
1fc20 2f 6e 61 74 69 76 65 20 74 79 70 65 20 6e 61 6d  /native type nam
1fc30 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 49 74 20 77  e...    /// It w
1fc40 69 6c 6c 20 69 6e 63 6c 75 64 65 20 73 69 7a 65  ill include size
1fc50 2c 20 70 72 65 63 69 73 69 6f 6e 20 6f 72 20 73  , precision or s
1fc60 63 61 6c 65 20 64 65 70 65 6e 64 69 6e 67 20 6f  cale depending o
1fc70 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
1fc80 6f 6e 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  on present in th
1fc90 65 0d 0a 20 20 20 20 2f 2f 2f 20 74 79 70 65 20  e..    /// type 
1fca0 66 61 63 65 74 73 0d 0a 20 20 20 20 2f 2f 2f 20  facets..    /// 
1fcb0 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
1fcc0 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1fcd0 22 74 79 70 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d  "type"></param>.
1fce0 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
1fcf0 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  s></returns>..  
1fd00 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e 67    private string
1fd10 20 47 65 74 53 71 6c 50 72 69 6d 69 74 69 76 65   GetSqlPrimitive
1fd20 54 79 70 65 28 54 79 70 65 55 73 61 67 65 20 74  Type(TypeUsage t
1fd30 79 70 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ype)..    {..   
1fd40 20 20 20 50 72 69 6d 69 74 69 76 65 54 79 70 65     PrimitiveType
1fd50 20 70 72 69 6d 69 74 69 76 65 54 79 70 65 20 3d   primitiveType =
1fd60 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73   MetadataHelpers
1fd70 2e 47 65 74 45 64 6d 54 79 70 65 3c 50 72 69 6d  .GetEdmType<Prim
1fd80 69 74 69 76 65 54 79 70 65 3e 28 74 79 70 65 29  itiveType>(type)
1fd90 3b 0d 0a 0d 0a 20 20 20 20 20 20 73 74 72 69 6e  ;....      strin
1fda0 67 20 74 79 70 65 4e 61 6d 65 20 3d 20 70 72 69  g typeName = pri
1fdb0 6d 69 74 69 76 65 54 79 70 65 2e 4e 61 6d 65 3b  mitiveType.Name;
1fdc0 0d 0a 20 20 20 20 20 20 62 6f 6f 6c 20 69 73 55  ..      bool isU
1fdd0 6e 69 63 6f 64 65 20 3d 20 74 72 75 65 3b 0d 0a  nicode = true;..
1fde0 20 20 20 20 20 20 62 6f 6f 6c 20 69 73 46 69 78        bool isFix
1fdf0 65 64 4c 65 6e 67 74 68 20 3d 20 66 61 6c 73 65  edLength = false
1fe00 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6d 61 78  ;..      int max
1fe10 4c 65 6e 67 74 68 20 3d 20 30 3b 0d 0a 20 20 20  Length = 0;..   
1fe20 20 20 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68     string length
1fe30 20 3d 20 22 6d 61 78 22 3b 0d 0a 20 20 20 20 20   = "max";..     
1fe40 20 62 6f 6f 6c 20 70 72 65 73 65 72 76 65 53 65   bool preserveSe
1fe50 63 6f 6e 64 73 20 3d 20 74 72 75 65 3b 0d 0a 20  conds = true;.. 
1fe60 20 20 20 20 20 62 79 74 65 20 64 65 63 69 6d 61       byte decima
1fe70 6c 50 72 65 63 69 73 69 6f 6e 20 3d 20 30 3b 0d  lPrecision = 0;.
1fe80 0a 20 20 20 20 20 20 62 79 74 65 20 64 65 63 69  .      byte deci
1fe90 6d 61 6c 53 63 61 6c 65 20 3d 20 30 3b 0d 0a 0d  malScale = 0;...
1fea0 0a 20 20 20 20 20 20 73 77 69 74 63 68 20 28 70  .      switch (p
1feb0 72 69 6d 69 74 69 76 65 54 79 70 65 2e 50 72 69  rimitiveType.Pri
1fec0 6d 69 74 69 76 65 54 79 70 65 4b 69 6e 64 29 0d  mitiveTypeKind).
1fed0 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
1fee0 20 20 63 61 73 65 20 50 72 69 6d 69 74 69 76 65    case Primitive
1fef0 54 79 70 65 4b 69 6e 64 2e 42 69 6e 61 72 79 3a  TypeKind.Binary:
1ff00 0d 0a 20 20 20 20 20 20 20 20 20 20 6d 61 78 4c  ..          maxL
1ff10 65 6e 67 74 68 20 3d 20 4d 65 74 61 64 61 74 61  ength = Metadata
1ff20 48 65 6c 70 65 72 73 2e 47 65 74 46 61 63 65 74  Helpers.GetFacet
1ff30 56 61 6c 75 65 4f 72 44 65 66 61 75 6c 74 3c 69  ValueOrDefault<i
1ff40 6e 74 3e 28 74 79 70 65 2c 20 4d 65 74 61 64 61  nt>(type, Metada
1ff50 74 61 48 65 6c 70 65 72 73 2e 4d 61 78 4c 65 6e  taHelpers.MaxLen
1ff60 67 74 68 46 61 63 65 74 4e 61 6d 65 2c 20 4d 65  gthFacetName, Me
1ff70 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e 42 69  tadataHelpers.Bi
1ff80 6e 61 72 79 4d 61 78 4d 61 78 4c 65 6e 67 74 68  naryMaxMaxLength
1ff90 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
1ffa0 20 28 6d 61 78 4c 65 6e 67 74 68 20 3d 3d 20 4d   (maxLength == M
1ffb0 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e 42  etadataHelpers.B
1ffc0 69 6e 61 72 79 4d 61 78 4d 61 78 4c 65 6e 67 74  inaryMaxMaxLengt
1ffd0 68 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  h)..          {.
1ffe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e  .            len
1fff0 67 74 68 20 3d 20 22 6d 61 78 22 3b 0d 0a 20 20  gth = "max";..  
20000 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20010 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
20020 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
20030 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 6d 61 78      length = max
20040 4c 65 6e 67 74 68 2e 54 6f 53 74 72 69 6e 67 28  Length.ToString(
20050 43 75 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76 61  CultureInfo.Inva
20060 72 69 61 6e 74 43 75 6c 74 75 72 65 29 3b 0d 0a  riantCulture);..
20070 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20080 20 20 20 20 20 20 20 69 73 46 69 78 65 64 4c 65         isFixedLe
20090 6e 67 74 68 20 3d 20 4d 65 74 61 64 61 74 61 48  ngth = MetadataH
200a0 65 6c 70 65 72 73 2e 47 65 74 46 61 63 65 74 56  elpers.GetFacetV
200b0 61 6c 75 65 4f 72 44 65 66 61 75 6c 74 3c 62 6f  alueOrDefault<bo
200c0 6f 6c 3e 28 74 79 70 65 2c 20 4d 65 74 61 64 61  ol>(type, Metada
200d0 74 61 48 65 6c 70 65 72 73 2e 46 69 78 65 64 4c  taHelpers.FixedL
200e0 65 6e 67 74 68 46 61 63 65 74 4e 61 6d 65 2c 20  engthFacetName, 
200f0 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20  false);..       
20100 20 20 20 74 79 70 65 4e 61 6d 65 20 3d 20 28 69     typeName = (i
20110 73 46 69 78 65 64 4c 65 6e 67 74 68 20 3f 20 22  sFixedLength ? "
20120 62 69 6e 61 72 79 28 22 20 3a 20 22 76 61 72 62  binary(" : "varb
20130 69 6e 61 72 79 28 22 29 20 2b 20 6c 65 6e 67 74  inary(") + lengt
20140 68 20 2b 20 22 29 22 3b 0d 0a 20 20 20 20 20 20  h + ")";..      
20150 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20      break;....  
20160 20 20 20 20 20 20 63 61 73 65 20 50 72 69 6d 69        case Primi
20170 74 69 76 65 54 79 70 65 4b 69 6e 64 2e 53 74 72  tiveTypeKind.Str
20180 69 6e 67 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  ing:..          
20190 2f 2f 20 51 75 65 73 74 69 6f 6e 3a 20 48 6f 77  // Question: How
201a0 20 64 6f 20 77 65 20 68 61 6e 64 6c 65 20 6e 74   do we handle nt
201b0 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ext?..          
201c0 69 73 55 6e 69 63 6f 64 65 20 3d 20 4d 65 74 61  isUnicode = Meta
201d0 64 61 74 61 48 65 6c 70 65 72 73 2e 47 65 74 46  dataHelpers.GetF
201e0 61 63 65 74 56 61 6c 75 65 4f 72 44 65 66 61 75  acetValueOrDefau
201f0 6c 74 3c 62 6f 6f 6c 3e 28 74 79 70 65 2c 20 4d  lt<bool>(type, M
20200 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e 55  etadataHelpers.U
20210 6e 69 63 6f 64 65 46 61 63 65 74 4e 61 6d 65 2c  nicodeFacetName,
20220 20 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 20   true);..       
20230 20 20 20 69 73 46 69 78 65 64 4c 65 6e 67 74 68     isFixedLength
20240 20 3d 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65   = MetadataHelpe
20250 72 73 2e 47 65 74 46 61 63 65 74 56 61 6c 75 65  rs.GetFacetValue
20260 4f 72 44 65 66 61 75 6c 74 3c 62 6f 6f 6c 3e 28  OrDefault<bool>(
20270 74 79 70 65 2c 20 4d 65 74 61 64 61 74 61 48 65  type, MetadataHe
20280 6c 70 65 72 73 2e 46 69 78 65 64 4c 65 6e 67 74  lpers.FixedLengt
20290 68 46 61 63 65 74 4e 61 6d 65 2c 20 66 61 6c 73  hFacetName, fals
202a0 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6d  e);..          m
202b0 61 78 4c 65 6e 67 74 68 20 3d 20 4d 65 74 61 64  axLength = Metad
202c0 61 74 61 48 65 6c 70 65 72 73 2e 47 65 74 46 61  ataHelpers.GetFa
202d0 63 65 74 56 61 6c 75 65 4f 72 44 65 66 61 75 6c  cetValueOrDefaul
202e0 74 3c 69 6e 74 3e 28 74 79 70 65 2c 20 4d 65 74  t<int>(type, Met
202f0 61 64 61 74 61 48 65 6c 70 65 72 73 2e 4d 61 78  adataHelpers.Max
20300 4c 65 6e 67 74 68 46 61 63 65 74 4e 61 6d 65 2c  LengthFacetName,
20310 20 49 6e 74 33 32 2e 4d 69 6e 56 61 6c 75 65 29   Int32.MinValue)
20320 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ;..          if 
20330 28 6d 61 78 4c 65 6e 67 74 68 20 3d 3d 20 49 6e  (maxLength == In
20340 74 33 32 2e 4d 69 6e 56 61 6c 75 65 29 0d 0a 20  t32.MinValue).. 
20350 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
20360 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d          length =
20370 20 22 6d 61 78 22 3b 0d 0a 20 20 20 20 20 20 20   "max";..       
20380 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
20390 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  else..          
203a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
203b0 65 6e 67 74 68 20 3d 20 6d 61 78 4c 65 6e 67 74  ength = maxLengt
203c0 68 2e 54 6f 53 74 72 69 6e 67 28 43 75 6c 74 75  h.ToString(Cultu
203d0 72 65 49 6e 66 6f 2e 49 6e 76 61 72 69 61 6e 74  reInfo.Invariant
203e0 43 75 6c 74 75 72 65 29 3b 0d 0a 20 20 20 20 20  Culture);..     
203f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20400 20 20 69 66 20 28 69 73 55 6e 69 63 6f 64 65 20    if (isUnicode 
20410 26 26 20 21 69 73 46 69 78 65 64 4c 65 6e 67 74  && !isFixedLengt
20420 68 20 26 26 20 6d 61 78 4c 65 6e 67 74 68 20 3e  h && maxLength >
20430 20 34 30 30 30 29 0d 0a 20 20 20 20 20 20 20 20   4000)..        
20440 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 22 6d 61      length = "ma
20450 78 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  x";..          i
20460 66 20 28 21 69 73 55 6e 69 63 6f 64 65 20 26 26  f (!isUnicode &&
20470 20 21 69 73 46 69 78 65 64 4c 65 6e 67 74 68 20   !isFixedLength 
20480 26 26 20 6d 61 78 4c 65 6e 67 74 68 20 3e 20 38  && maxLength > 8
20490 30 30 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20  000)..          
204a0 20 20 6c 65 6e 67 74 68 20 3d 20 22 6d 61 78 22    length = "max"
204b0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ;..          if 
204c0 28 69 73 46 69 78 65 64 4c 65 6e 67 74 68 29 0d  (isFixedLength).
204d0 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
204e0 20 20 20 20 20 20 20 20 20 20 74 79 70 65 4e 61            typeNa
204f0 6d 65 20 3d 20 28 69 73 55 6e 69 63 6f 64 65 20  me = (isUnicode 
20500 3f 20 22 6e 63 68 61 72 28 22 20 3a 20 22 63 68  ? "nchar(" : "ch
20510 61 72 28 22 29 20 2b 20 6c 65 6e 67 74 68 20 2b  ar(") + length +
20520 20 22 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 20   ")";..         
20530 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6c   }..          el
20540 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  se..          {.
20550 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 79 70  .            typ
20560 65 4e 61 6d 65 20 3d 20 28 69 73 55 6e 69 63 6f  eName = (isUnico
20570 64 65 20 3f 20 22 6e 76 61 72 63 68 61 72 28 22  de ? "nvarchar("
20580 20 3a 20 22 76 61 72 63 68 61 72 28 22 29 20 2b   : "varchar(") +
20590 20 6c 65 6e 67 74 68 20 2b 20 22 29 22 3b 0d 0a   length + ")";..
205a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
205b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d         break;...
205c0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 50 72  .        case Pr
205d0 69 6d 69 74 69 76 65 54 79 70 65 4b 69 6e 64 2e  imitiveTypeKind.
205e0 44 61 74 65 54 69 6d 65 3a 0d 0a 20 20 20 20 20  DateTime:..     
205f0 20 20 20 20 20 70 72 65 73 65 72 76 65 53 65 63       preserveSec
20600 6f 6e 64 73 20 3d 20 4d 65 74 61 64 61 74 61 48  onds = MetadataH
20610 65 6c 70 65 72 73 2e 47 65 74 46 61 63 65 74 56  elpers.GetFacetV
20620 61 6c 75 65 4f 72 44 65 66 61 75 6c 74 3c 62 6f  alueOrDefault<bo
20630 6f 6c 3e 28 74 79 70 65 2c 20 4d 65 74 61 64 61  ol>(type, Metada
20640 74 61 48 65 6c 70 65 72 73 2e 50 72 65 73 65 72  taHelpers.Preser
20650 76 65 53 65 63 6f 6e 64 73 46 61 63 65 74 4e 61  veSecondsFacetNa
20660 6d 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20  me, false);..   
20670 20 20 20 20 20 20 20 74 79 70 65 4e 61 6d 65 20         typeName 
20680 3d 20 70 72 65 73 65 72 76 65 53 65 63 6f 6e 64  = preserveSecond
20690 73 20 3f 20 22 64 61 74 65 74 69 6d 65 22 20 3a  s ? "datetime" :
206a0 20 22 73 6d 61 6c 6c 64 61 74 65 74 69 6d 65 22   "smalldatetime"
206b0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ;..          bre
206c0 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63  ak;....        c
206d0 61 73 65 20 50 72 69 6d 69 74 69 76 65 54 79 70  ase PrimitiveTyp
206e0 65 4b 69 6e 64 2e 44 65 63 69 6d 61 6c 3a 0d 0a  eKind.Decimal:..
206f0 20 20 20 20 20 20 20 20 20 20 64 65 63 69 6d 61            decima
20700 6c 50 72 65 63 69 73 69 6f 6e 20 3d 20 4d 65 74  lPrecision = Met
20710 61 64 61 74 61 48 65 6c 70 65 72 73 2e 47 65 74  adataHelpers.Get
20720 46 61 63 65 74 56 61 6c 75 65 4f 72 44 65 66 61  FacetValueOrDefa
20730 75 6c 74 3c 62 79 74 65 3e 28 74 79 70 65 2c 20  ult<byte>(type, 
20740 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e  MetadataHelpers.
20750 50 72 65 63 69 73 69 6f 6e 46 61 63 65 74 4e 61  PrecisionFacetNa
20760 6d 65 2c 20 31 38 29 3b 0d 0a 20 20 20 20 20 20  me, 18);..      
20770 20 20 20 20 44 65 62 75 67 2e 41 73 73 65 72 74      Debug.Assert
20780 28 64 65 63 69 6d 61 6c 50 72 65 63 69 73 69 6f  (decimalPrecisio
20790 6e 20 3e 20 30 2c 20 22 64 65 63 69 6d 61 6c 20  n > 0, "decimal 
207a0 70 72 65 63 69 73 69 6f 6e 20 6d 75 73 74 20 62  precision must b
207b0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
207c0 65 72 6f 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ero");..        
207d0 20 20 64 65 63 69 6d 61 6c 53 63 61 6c 65 20 3d    decimalScale =
207e0 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73   MetadataHelpers
207f0 2e 47 65 74 46 61 63 65 74 56 61 6c 75 65 4f 72  .GetFacetValueOr
20800 44 65 66 61 75 6c 74 3c 62 79 74 65 3e 28 74 79  Default<byte>(ty
20810 70 65 2c 20 4d 65 74 61 64 61 74 61 48 65 6c 70  pe, MetadataHelp
20820 65 72 73 2e 53 63 61 6c 65 46 61 63 65 74 4e 61  ers.ScaleFacetNa
20830 6d 65 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20  me, 0);..       
20840 20 20 20 44 65 62 75 67 2e 41 73 73 65 72 74 28     Debug.Assert(
20850 64 65 63 69 6d 61 6c 50 72 65 63 69 73 69 6f 6e  decimalPrecision
20860 20 3e 3d 20 64 65 63 69 6d 61 6c 53 63 61 6c 65   >= decimalScale
20870 2c 20 22 64 65 63 69 6d 61 6c 50 72 65 63 69 73  , "decimalPrecis
20880 69 6f 6e 20 6d 75 73 74 20 62 65 20 67 72 65 61  ion must be grea
20890 74 65 72 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  ter or equal to 
208a0 64 65 63 69 6d 61 6c 53 63 61 6c 65 22 29 3b 0d  decimalScale");.
208b0 0a 20 20 20 20 20 20 20 20 20 20 44 65 62 75 67  .          Debug
208c0 2e 41 73 73 65 72 74 28 64 65 63 69 6d 61 6c 50  .Assert(decimalP
208d0 72 65 63 69 73 69 6f 6e 20 3c 3d 20 35 33 2c 20  recision <= 53, 
208e0 22 64 65 63 69 6d 61 6c 50 72 65 63 69 73 69 6f  "decimalPrecisio
208f0 6e 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  n must be less t
20900 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
20910 35 33 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  53");..         
20920 20 74 79 70 65 4e 61 6d 65 20 3d 20 74 79 70 65   typeName = type
20930 4e 61 6d 65 20 2b 20 22 28 22 20 2b 20 64 65 63  Name + "(" + dec
20940 69 6d 61 6c 50 72 65 63 69 73 69 6f 6e 20 2b 20  imalPrecision + 
20950 22 2c 22 20 2b 20 64 65 63 69 6d 61 6c 53 63 61  "," + decimalSca
20960 6c 65 20 2b 20 22 29 22 3b 0d 0a 20 20 20 20 20  le + ")";..     
20970 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20       break;.... 
20980 20 20 20 20 20 20 20 63 61 73 65 20 50 72 69 6d         case Prim
20990 69 74 69 76 65 54 79 70 65 4b 69 6e 64 2e 49 6e  itiveTypeKind.In
209a0 74 33 32 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  t32:..          
209b0 74 79 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74 22  typeName = "int"
209c0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ;..          bre
209d0 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63  ak;....        c
209e0 61 73 65 20 50 72 69 6d 69 74 69 76 65 54 79 70  ase PrimitiveTyp
209f0 65 4b 69 6e 64 2e 49 6e 74 36 34 3a 0d 0a 20 20  eKind.Int64:..  
20a00 20 20 20 20 20 20 20 20 74 79 70 65 4e 61 6d 65          typeName
20a10 20 3d 20 22 62 69 67 69 6e 74 22 3b 0d 0a 20 20   = "bigint";..  
20a20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
20a30 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 50  ..        case P
20a40 72 69 6d 69 74 69 76 65 54 79 70 65 4b 69 6e 64  rimitiveTypeKind
20a50 2e 49 6e 74 31 36 3a 0d 0a 20 20 20 20 20 20 20  .Int16:..       
20a60 20 20 20 74 79 70 65 4e 61 6d 65 20 3d 20 22 73     typeName = "s
20a70 6d 61 6c 6c 69 6e 74 22 3b 0d 0a 20 20 20 20 20  mallint";..     
20a80 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20       break;.... 
20a90 20 20 20 20 20 20 20 63 61 73 65 20 50 72 69 6d         case Prim
20aa0 69 74 69 76 65 54 79 70 65 4b 69 6e 64 2e 42 79  itiveTypeKind.By
20ab0 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  te:..          t
20ac0 79 70 65 4e 61 6d 65 20 3d 20 22 74 69 6e 79 69  ypeName = "tinyi
20ad0 6e 74 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nt";..          
20ae0 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20  break;....      
20af0 20 20 63 61 73 65 20 50 72 69 6d 69 74 69 76 65    case Primitive
20b00 54 79 70 65 4b 69 6e 64 2e 42 6f 6f 6c 65 61 6e  TypeKind.Boolean
20b10 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 79 70  :..          typ
20b20 65 4e 61 6d 65 20 3d 20 22 62 69 74 22 3b 0d 0a  eName = "bit";..
20b30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
20b40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65  ....        case
20b50 20 50 72 69 6d 69 74 69 76 65 54 79 70 65 4b 69   PrimitiveTypeKi
20b60 6e 64 2e 53 69 6e 67 6c 65 3a 0d 0a 20 20 20 20  nd.Single:..    
20b70 20 20 20 20 20 20 74 79 70 65 4e 61 6d 65 20 3d        typeName =
20b80 20 22 72 65 61 6c 22 3b 0d 0a 20 20 20 20 20 20   "real";..      
20b90 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20      break;....  
20ba0 20 20 20 20 20 20 63 61 73 65 20 50 72 69 6d 69        case Primi
20bb0 74 69 76 65 54 79 70 65 4b 69 6e 64 2e 44 6f 75  tiveTypeKind.Dou
20bc0 62 6c 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  ble:..          
20bd0 74 79 70 65 4e 61 6d 65 20 3d 20 22 66 6c 6f 61  typeName = "floa
20be0 74 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  t";..          b
20bf0 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  reak;....       
20c00 20 63 61 73 65 20 50 72 69 6d 69 74 69 76 65 54   case PrimitiveT
20c10 79 70 65 4b 69 6e 64 2e 47 75 69 64 3a 0d 0a 20  ypeKind.Guid:.. 
20c20 20 20 20 20 20 20 20 20 20 74 79 70 65 4e 61 6d           typeNam
20c30 65 20 3d 20 22 75 6e 69 71 75 65 69 64 65 6e 74  e = "uniqueident
20c40 69 66 69 65 72 22 3b 0d 0a 20 20 20 20 20 20 20  ifier";..       
20c50 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20     break;....   
20c60 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20       default:.. 
20c70 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
20c80 65 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64 45  ew NotSupportedE
20c90 78 63 65 70 74 69 6f 6e 28 22 55 6e 73 75 70 70  xception("Unsupp
20ca0 6f 72 74 65 64 20 45 64 6d 54 79 70 65 3a 20 22  orted EdmType: "
20cb0 20 2b 20 70 72 69 6d 69 74 69 76 65 54 79 70 65   + primitiveType
20cc0 2e 50 72 69 6d 69 74 69 76 65 54 79 70 65 4b 69  .PrimitiveTypeKi
20cd0 6e 64 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  nd);..      }...
20ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 79  .      return ty
20cf0 70 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 7d 0d 0a  peName;..    }..
20d00 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
20d10 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 61 6e  ry>..    /// Han
20d20 64 6c 65 73 20 74 68 65 20 65 78 70 72 65 73 73  dles the express
20d30 69 6f 6e 20 72 65 70 72 65 73 65 6e 64 69 6e 67  ion represending
20d40 20 44 62 4c 69 6d 69 74 45 78 70 72 65 73 73 69   DbLimitExpressi
20d50 6f 6e 2e 4c 69 6d 69 74 20 61 6e 64 20 44 62 53  on.Limit and DbS
20d60 6b 69 70 45 78 70 72 65 73 73 69 6f 6e 2e 43 6f  kipExpression.Co
20d70 75 6e 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 49 66  unt...    /// If
20d80 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
20d90 74 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 74  t expression, it
20da0 20 73 69 6d 70 6c 79 20 64 6f 65 73 20 74 6f 20   simply does to 
20db0 73 74 72 69 6e 67 20 74 68 75 73 20 61 76 6f 69  string thus avoi
20dc0 64 69 6e 67 20 63 61 73 74 69 6e 67 20 69 74 20  ding casting it 
20dd0 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 63 20  to the specific 
20de0 76 61 6c 75 65 0d 0a 20 20 20 20 2f 2f 2f 20 28  value..    /// (
20df0 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 64  which would be d
20e00 6f 6e 65 20 69 66 20 3c 73 65 65 20 63 72 65 66  one if <see cref
20e10 3d 22 56 69 73 69 74 28 44 62 43 6f 6e 73 74 61  ="Visit(DbConsta
20e20 6e 74 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e  ntExpression)"/>
20e30 20 69 73 20 63 61 6c 6c 65 64 29 0d 0a 20 20 20   is called)..   
20e40 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
20e50 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
20e60 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d  name="e"></param
20e70 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
20e80 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  rns></returns>..
20e90 20 20 20 20 70 72 69 76 61 74 65 20 49 53 71 6c      private ISql
20ea0 46 72 61 67 6d 65 6e 74 20 48 61 6e 64 6c 65 43  Fragment HandleC
20eb0 6f 75 6e 74 45 78 70 72 65 73 73 69 6f 6e 28 44  ountExpression(D
20ec0 62 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a  bExpression e)..
20ed0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 49 53 71      {..      ISq
20ee0 6c 46 72 61 67 6d 65 6e 74 20 72 65 73 75 6c 74  lFragment result
20ef0 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 65  ;....      if (e
20f00 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 20  .ExpressionKind 
20f10 3d 3d 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b  == DbExpressionK
20f20 69 6e 64 2e 43 6f 6e 73 74 61 6e 74 29 0d 0a 20  ind.Constant).. 
20f30 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
20f40 2f 2f 46 6f 72 20 63 6f 6e 73 74 61 6e 74 20 65  //For constant e
20f50 78 70 72 65 73 73 69 6f 6e 20 77 65 20 73 68 6f  xpression we sho
20f60 75 6c 64 20 6e 6f 74 20 63 61 73 74 20 74 68 65  uld not cast the
20f70 20 76 61 6c 75 65 2c 0d 0a 20 20 20 20 20 20 20   value,..       
20f80 20 2f 2f 20 74 68 75 73 20 77 65 20 64 6f 6e 27   // thus we don'
20f90 74 20 67 6f 20 74 68 72 6f 75 67 68 74 20 74 68  t go throught th
20fa0 65 20 64 65 66 61 75 6c 74 20 44 62 43 6f 6e 73  e default DbCons
20fb0 74 61 6e 74 45 78 70 72 65 73 73 69 6f 6e 20 68  tantExpression h
20fc0 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20  andling..       
20fd0 20 53 71 6c 42 75 69 6c 64 65 72 20 73 71 6c 42   SqlBuilder sqlB
20fe0 75 69 6c 64 65 72 20 3d 20 6e 65 77 20 53 71 6c  uilder = new Sql
20ff0 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20  Builder();..    
21000 20 20 20 20 73 71 6c 42 75 69 6c 64 65 72 2e 41      sqlBuilder.A
21010 70 70 65 6e 64 28 28 28 44 62 43 6f 6e 73 74 61  ppend(((DbConsta
21020 6e 74 45 78 70 72 65 73 73 69 6f 6e 29 65 29 2e  ntExpression)e).
21030 56 61 6c 75 65 2e 54 6f 53 74 72 69 6e 67 28 29  Value.ToString()
21040 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75  );..        resu
21050 6c 74 20 3d 20 73 71 6c 42 75 69 6c 64 65 72 3b  lt = sqlBuilder;
21060 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
21070 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a   else..      {..
21080 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
21090 20 65 2e 41 63 63 65 70 74 28 74 68 69 73 29 3b   e.Accept(this);
210a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
210b0 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
210c0 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
210d0 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
210e0 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 75     /// This is u
210f0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
21100 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   if a particular
21110 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
21120 6e 20 41 70 70 6c 79 20 6f 70 65 72 61 74 69 6f  n Apply operatio
21130 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73  n...    /// This
21140 20 69 73 20 6f 6e 6c 79 20 74 68 65 20 63 61 73   is only the cas
21150 65 20 77 68 65 6e 20 74 68 65 20 44 62 45 78 70  e when the DbExp
21160 72 65 73 73 69 6f 6e 4b 69 6e 64 20 69 73 20 43  ressionKind is C
21170 72 6f 73 73 41 70 70 6c 79 20 6f 72 20 4f 75 74  rossApply or Out
21180 65 72 41 70 70 6c 79 2e 0d 0a 20 20 20 20 2f 2f  erApply...    //
21190 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
211a0 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
211b0 65 3d 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  e="e"></param>..
211c0 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
211d0 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  ></returns>..   
211e0 20 62 6f 6f 6c 20 49 73 41 70 70 6c 79 45 78 70   bool IsApplyExp
211f0 72 65 73 73 69 6f 6e 28 44 62 45 78 70 72 65 73  ression(DbExpres
21200 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d 0a  sion e)..    {..
21210 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 44 62        return (Db
21220 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 43  ExpressionKind.C
21230 72 6f 73 73 41 70 70 6c 79 20 3d 3d 20 65 2e 45  rossApply == e.E
21240 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 20 7c 7c  xpressionKind ||
21250 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e   DbExpressionKin
21260 64 2e 4f 75 74 65 72 41 70 70 6c 79 20 3d 3d 20  d.OuterApply == 
21270 65 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64  e.ExpressionKind
21280 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
21290 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 49 73   private bool Is
212a0 4b 65 79 46 6f 72 49 6e 28 44 62 45 78 70 72 65  KeyForIn(DbExpre
212b0 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20 20 7b 0d  ssion e)..    {.
212c0 0a 20 20 20 20 20 20 69 66 20 28 28 65 2e 45 78  .      if ((e.Ex
212d0 70 72 65 73 73 69 6f 6e 4b 69 6e 64 20 21 3d 20  pressionKind != 
212e0 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64  DbExpressionKind
212f0 2e 50 72 6f 70 65 72 74 79 29 20 26 26 20 28 65  .Property) && (e
21300 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 20  .ExpressionKind 
21310 21 3d 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b  != DbExpressionK
21320 69 6e 64 2e 56 61 72 69 61 62 6c 65 52 65 66 65  ind.VariableRefe
21330 72 65 6e 63 65 29 29 0d 0a 20 20 20 20 20 20 7b  rence))..      {
21340 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
21350 20 28 65 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69   (e.ExpressionKi
21360 6e 64 20 3d 3d 20 44 62 45 78 70 72 65 73 73 69  nd == DbExpressi
21370 6f 6e 4b 69 6e 64 2e 50 61 72 61 6d 65 74 65 72  onKind.Parameter
21380 52 65 66 65 72 65 6e 63 65 29 3b 0d 0a 20 20 20  Reference);..   
21390 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75     }..      retu
213a0 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 7d 0d  rn true;..    }.
213b0 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
213c0 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  ary>..    /// Th
213d0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  is is used to de
213e0 74 65 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72  termine if a par
213f0 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
21400 6f 6e 20 69 73 20 61 20 4a 6f 69 6e 20 6f 70 65  on is a Join ope
21410 72 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f  ration...    ///
21420 20 54 68 69 73 20 69 73 20 74 72 75 65 20 66 6f   This is true fo
21430 72 20 44 62 43 72 6f 73 73 4a 6f 69 6e 45 78 70  r DbCrossJoinExp
21440 72 65 73 73 69 6f 6e 20 61 6e 64 20 44 62 4a 6f  ression and DbJo
21450 69 6e 45 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  inExpression, th
21460 65 0d 0a 20 20 20 20 2f 2f 2f 20 6c 61 74 74 65  e..    /// latte
21470 72 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 68  r of which may h
21480 61 76 65 20 6f 6e 65 20 6f 66 20 73 65 76 65 72  ave one of sever
21490 61 6c 20 64 69 66 66 65 72 65 6e 74 20 45 78 70  al different Exp
214a0 72 65 73 73 69 6f 6e 4b 69 6e 64 73 2e 0d 0a 20  ressionKinds... 
214b0 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
214c0 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
214d0 6d 20 6e 61 6d 65 3d 22 65 22 3e 3c 2f 70 61 72  m name="e"></par
214e0 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  am>..    /// <re
214f0 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e  turns></returns>
21500 0d 0a 20 20 20 20 62 6f 6f 6c 20 49 73 4a 6f 69  ..    bool IsJoi
21510 6e 45 78 70 72 65 73 73 69 6f 6e 28 44 62 45 78  nExpression(DbEx
21520 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 20 20 20  pression e)..   
21530 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
21540 20 28 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69   (DbExpressionKi
21550 6e 64 2e 43 72 6f 73 73 4a 6f 69 6e 20 3d 3d 20  nd.CrossJoin == 
21560 65 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64  e.ExpressionKind
21570 20 7c 7c 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ||..           
21580 20 20 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b     DbExpressionK
21590 69 6e 64 2e 46 75 6c 6c 4f 75 74 65 72 4a 6f 69  ind.FullOuterJoi
215a0 6e 20 3d 3d 20 65 2e 45 78 70 72 65 73 73 69 6f  n == e.Expressio
215b0 6e 4b 69 6e 64 20 7c 7c 0d 0a 20 20 20 20 20 20  nKind ||..      
215c0 20 20 20 20 20 20 20 20 44 62 45 78 70 72 65 73          DbExpres
215d0 73 69 6f 6e 4b 69 6e 64 2e 49 6e 6e 65 72 4a 6f  sionKind.InnerJo
215e0 69 6e 20 3d 3d 20 65 2e 45 78 70 72 65 73 73 69  in == e.Expressi
215f0 6f 6e 4b 69 6e 64 20 7c 7c 0d 0a 20 20 20 20 20  onKind ||..     
21600 20 20 20 20 20 20 20 20 20 44 62 45 78 70 72 65           DbExpre
21610 73 73 69 6f 6e 4b 69 6e 64 2e 4c 65 66 74 4f 75  ssionKind.LeftOu
21620 74 65 72 4a 6f 69 6e 20 3d 3d 20 65 2e 45 78 70  terJoin == e.Exp
21630 72 65 73 73 69 6f 6e 4b 69 6e 64 29 3b 0d 0a 20  ressionKind);.. 
21640 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
21650 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
21660 2f 2f 20 54 68 69 73 20 69 73 20 75 73 65 64 20  // This is used 
21670 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
21680 61 20 63 61 6c 6c 69 6e 67 20 65 78 70 72 65 73  a calling expres
21690 73 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 70 6c  sion needs to pl
216a0 61 63 65 0d 0a 20 20 20 20 2f 2f 2f 20 72 6f 75  ace..    /// rou
216b0 6e 64 20 62 72 61 63 6b 65 74 73 20 61 72 6f 75  nd brackets arou
216c0 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 69  nd the translati
216d0 6f 6e 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  on of the expres
216e0 73 69 6f 6e 20 65 2e 0d 0a 20 20 20 20 2f 2f 2f  sion e...    ///
216f0 0d 0a 20 20 20 20 2f 2f 2f 20 43 6f 6e 73 74 61  ..    /// Consta
21700 6e 74 73 2c 20 70 61 72 61 6d 65 74 65 72 73 20  nts, parameters 
21710 61 6e 64 20 70 72 6f 70 65 72 74 69 65 73 20 64  and properties d
21720 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 62 72  o not require br
21730 61 63 6b 65 74 73 2c 0d 0a 20 20 20 20 2f 2f 2f  ackets,..    ///
21740 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
21750 20 64 6f 65 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20   does...    /// 
21760 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
21770 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
21780 22 65 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  "e"></param>..  
21790 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 74    /// <returns>t
217a0 72 75 65 2c 20 69 66 20 74 68 65 20 65 78 70 72  rue, if the expr
217b0 65 73 73 69 6f 6e 20 6e 65 65 64 73 20 62 72 61  ession needs bra
217c0 63 6b 65 74 73 20 3c 2f 72 65 74 75 72 6e 73 3e  ckets </returns>
217d0 0d 0a 20 20 20 20 62 6f 6f 6c 20 49 73 43 6f 6d  ..    bool IsCom
217e0 70 6c 65 78 45 78 70 72 65 73 73 69 6f 6e 28 44  plexExpression(D
217f0 62 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a  bExpression e)..
21800 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 73 77 69      {..      swi
21810 74 63 68 20 28 65 2e 45 78 70 72 65 73 73 69 6f  tch (e.Expressio
21820 6e 4b 69 6e 64 29 0d 0a 20 20 20 20 20 20 7b 0d  nKind)..      {.
21830 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 44 62  .        case Db
21840 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 43  ExpressionKind.C
21850 6f 6e 73 74 61 6e 74 3a 0d 0a 20 20 20 20 20 20  onstant:..      
21860 20 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73    case DbExpress
21870 69 6f 6e 4b 69 6e 64 2e 50 61 72 61 6d 65 74 65  ionKind.Paramete
21880 72 52 65 66 65 72 65 6e 63 65 3a 0d 0a 20 20 20  rReference:..   
21890 20 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72       case DbExpr
218a0 65 73 73 69 6f 6e 4b 69 6e 64 2e 50 72 6f 70 65  essionKind.Prope
218b0 72 74 79 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  rty:..          
218c0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
218d0 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
218e0 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  :..          ret
218f0 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  urn true;..     
21900 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
21910 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
21920 20 20 20 20 2f 2f 2f 20 44 65 74 65 72 6d 69 6e      /// Determin
21930 65 20 69 66 20 74 68 65 20 6f 77 6e 65 72 20 65  e if the owner e
21940 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 61 64  xpression can ad
21950 64 20 69 74 73 20 75 6e 69 71 75 65 20 73 71 6c  d its unique sql
21960 20 74 6f 20 74 68 65 20 69 6e 70 75 74 27 73 0d   to the input's.
21970 0a 20 20 20 20 2f 2f 2f 20 53 71 6c 53 65 6c 65  .    /// SqlSele
21980 63 74 53 74 61 74 65 6d 65 6e 74 0d 0a 20 20 20  ctStatement..   
21990 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
219a0 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
219b0 6e 61 6d 65 3d 22 72 65 73 75 6c 74 22 3e 54 68  name="result">Th
219c0 65 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65  e SqlSelectState
219d0 6d 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 70 75  ment of the inpu
219e0 74 20 74 6f 20 74 68 65 20 72 65 6c 61 74 69 6f  t to the relatio
219f0 6e 61 6c 20 6e 6f 64 65 2e 3c 2f 70 61 72 61 6d  nal node.</param
21a00 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
21a10 6d 20 6e 61 6d 65 3d 22 65 78 70 72 65 73 73 69  m name="expressi
21a20 6f 6e 4b 69 6e 64 22 3e 54 68 65 20 6b 69 6e 64  onKind">The kind
21a30 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
21a40 6f 6e 20 6e 6f 64 65 28 6e 6f 74 20 74 68 65 20  on node(not the 
21a50 69 6e 70 75 74 27 73 29 3c 2f 70 61 72 61 6d 3e  input's)</param>
21a60 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72  ..    /// <retur
21a70 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  ns></returns>.. 
21a80 20 20 20 62 6f 6f 6c 20 49 73 43 6f 6d 70 61 74     bool IsCompat
21a90 69 62 6c 65 28 53 71 6c 53 65 6c 65 63 74 53 74  ible(SqlSelectSt
21aa0 61 74 65 6d 65 6e 74 20 72 65 73 75 6c 74 2c 20  atement result, 
21ab0 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64  DbExpressionKind
21ac0 20 65 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 29   expressionKind)
21ad0 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 73  ..    {..      s
21ae0 77 69 74 63 68 20 28 65 78 70 72 65 73 73 69 6f  witch (expressio
21af0 6e 4b 69 6e 64 29 0d 0a 20 20 20 20 20 20 7b 0d  nKind)..      {.
21b00 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 44 62  .        case Db
21b10 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 44  ExpressionKind.D
21b20 69 73 74 69 6e 63 74 3a 0d 0a 20 20 20 20 20 20  istinct:..      
21b30 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
21b40 74 2e 54 6f 70 20 3d 3d 20 6e 75 6c 6c 0d 0a 20  t.Top == null.. 
21b50 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54 68             // Th
21b60 65 20 70 72 6f 6a 65 63 74 69 6f 6e 20 61 66 74  e projection aft
21b70 65 72 20 64 69 73 74 69 6e 63 74 20 6d 61 79 20  er distinct may 
21b80 6e 6f 74 20 70 72 6f 6a 65 63 74 20 61 6c 6c 0d  not project all.
21b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
21ba0 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 69 6e 20  columns used in 
21bb0 74 68 65 20 4f 72 64 65 72 20 42 79 0d 0a 20 20  the Order By..  
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72              && r
21bd0 65 73 75 6c 74 2e 4f 72 64 65 72 42 79 2e 49 73  esult.OrderBy.Is
21be0 45 6d 70 74 79 3b 0d 0a 0d 0a 20 20 20 20 20 20  Empty;....      
21bf0 20 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73    case DbExpress
21c00 69 6f 6e 4b 69 6e 64 2e 46 69 6c 74 65 72 3a 0d  ionKind.Filter:.
21c10 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21c20 6e 20 72 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e  n result.Select.
21c30 49 73 45 6d 70 74 79 0d 0a 20 20 20 20 20 20 20  IsEmpty..       
21c40 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72 65             && re
21c50 73 75 6c 74 2e 57 68 65 72 65 2e 49 73 45 6d 70  sult.Where.IsEmp
21c60 74 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty..            
21c70 20 20 20 20 20 20 26 26 20 72 65 73 75 6c 74 2e        && result.
21c80 47 72 6f 75 70 42 79 2e 49 73 45 6d 70 74 79 0d  GroupBy.IsEmpty.
21c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21ca0 20 20 20 26 26 20 72 65 73 75 6c 74 2e 54 6f 70     && result.Top
21cb0 20 3d 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20   == null;....   
21cc0 20 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72       case DbExpr
21cd0 65 73 73 69 6f 6e 4b 69 6e 64 2e 47 72 6f 75 70  essionKind.Group
21ce0 42 79 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  By:..          r
21cf0 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 53 65 6c  eturn result.Sel
21d00 65 63 74 2e 49 73 45 6d 70 74 79 0d 0a 20 20 20  ect.IsEmpty..   
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
21d20 26 20 72 65 73 75 6c 74 2e 47 72 6f 75 70 42 79  & result.GroupBy
21d30 2e 49 73 45 6d 70 74 79 0d 0a 20 20 20 20 20 20  .IsEmpty..      
21d40 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72              && r
21d50 65 73 75 6c 74 2e 4f 72 64 65 72 42 79 2e 49 73  esult.OrderBy.Is
21d60 45 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 20  Empty..         
21d70 20 20 20 20 20 20 20 20 20 26 26 20 72 65 73 75           && resu
21d80 6c 74 2e 54 6f 70 20 3d 3d 20 6e 75 6c 6c 3b 0d  lt.Top == null;.
21d90 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ...        case 
21da0 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64  DbExpressionKind
21db0 2e 4c 69 6d 69 74 3a 0d 0a 20 20 20 20 20 20 20  .Limit:..       
21dc0 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73 69   case DbExpressi
21dd0 6f 6e 4b 69 6e 64 2e 45 6c 65 6d 65 6e 74 3a 0d  onKind.Element:.
21de0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21df0 6e 20 72 65 73 75 6c 74 2e 54 6f 70 20 3d 3d 20  n result.Top == 
21e00 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  null;....       
21e10 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73 69   case DbExpressi
21e20 6f 6e 4b 69 6e 64 2e 50 72 6f 6a 65 63 74 3a 0d  onKind.Project:.
21e30 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21e40 6e 20 72 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e  n result.Select.
21e50 49 73 45 6d 70 74 79 0d 0a 20 20 20 20 20 20 20  IsEmpty..       
21e60 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72 65             && re
21e70 73 75 6c 74 2e 47 72 6f 75 70 42 79 2e 49 73 45  sult.GroupBy.IsE
21e80 6d 70 74 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  mpty;....       
21e90 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73 69   case DbExpressi
21ea0 6f 6e 4b 69 6e 64 2e 53 6b 69 70 3a 0d 0a 20 20  onKind.Skip:..  
21eb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
21ec0 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e 49 73 45  esult.Select.IsE
21ed0 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 20 20  mpty..          
21ee0 20 20 20 20 20 20 20 20 26 26 20 72 65 73 75 6c          && resul
21ef0 74 2e 47 72 6f 75 70 42 79 2e 49 73 45 6d 70 74  t.GroupBy.IsEmpt
21f00 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
21f10 20 20 20 20 20 26 26 20 72 65 73 75 6c 74 2e 4f       && result.O
21f20 72 64 65 72 42 79 2e 49 73 45 6d 70 74 79 0d 0a  rderBy.IsEmpty..
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f40 20 20 26 26 20 21 72 65 73 75 6c 74 2e 49 73 44    && !result.IsD
21f50 69 73 74 69 6e 63 74 3b 0d 0a 0d 0a 20 20 20 20  istinct;....    
21f60 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65      case DbExpre
21f70 73 73 69 6f 6e 4b 69 6e 64 2e 53 6f 72 74 3a 0d  ssionKind.Sort:.
21f80 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21f90 6e 20 72 65 73 75 6c 74 2e 53 65 6c 65 63 74 2e  n result.Select.
21fa0 49 73 45 6d 70 74 79 0d 0a 20 20 20 20 20 20 20  IsEmpty..       
21fb0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72 65             && re
21fc0 73 75 6c 74 2e 47 72 6f 75 70 42 79 2e 49 73 45  sult.GroupBy.IsE
21fd0 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 20 20  mpty..          
21fe0 20 20 20 20 20 20 20 20 26 26 20 72 65 73 75 6c          && resul
21ff0 74 2e 4f 72 64 65 72 42 79 2e 49 73 45 6d 70 74  t.OrderBy.IsEmpt
22000 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 65  y;....        de
22010 66 61 75 6c 74 3a 0d 0a 20 20 20 20 20 20 20 20  fault:..        
22020 20 20 44 65 62 75 67 2e 41 73 73 65 72 74 28 66    Debug.Assert(f
22030 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alse);..        
22040 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61    throw new Inva
22050 6c 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65  lidOperationExce
22060 70 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 20 20  ption();..      
22070 7d 0d 0a 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  }....    }....  
22080 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 50    private void P
22090 61 72 65 6e 74 68 65 73 69 7a 65 45 78 70 72 65  arenthesizeExpre
220a0 73 73 69 6f 6e 57 69 74 68 6f 75 74 52 65 64 75  ssionWithoutRedu
220b0 6e 64 61 6e 74 43 6f 6e 73 74 61 6e 74 43 61 73  ndantConstantCas
220c0 74 73 28 44 62 45 78 70 72 65 73 73 69 6f 6e 20  ts(DbExpression 
220d0 76 61 6c 75 65 2c 20 53 71 6c 42 75 69 6c 64 65  value, SqlBuilde
220e0 72 20 73 71 6c 42 75 69 6c 64 65 72 29 0d 0a 20  r sqlBuilder).. 
220f0 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 28     {..      if (
22100 76 61 6c 75 65 2e 45 78 70 72 65 73 73 69 6f 6e  value.Expression
22110 4b 69 6e 64 20 3d 3d 20 44 62 45 78 70 72 65 73  Kind == DbExpres
22120 73 69 6f 6e 4b 69 6e 64 2e 43 6f 6e 73 74 61 6e  sionKind.Constan
22130 74 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  t)..      {..   
22140 20 20 20 20 20 73 71 6c 42 75 69 6c 64 65 72 2e       sqlBuilder.
22150 41 70 70 65 6e 64 28 74 68 69 73 2e 56 69 73 69  Append(this.Visi
22160 74 28 28 44 62 43 6f 6e 73 74 61 6e 74 45 78 70  t((DbConstantExp
22170 72 65 73 73 69 6f 6e 29 76 61 6c 75 65 29 29 3b  ression)value));
22180 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
22190 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a   else..      {..
221a0 20 20 20 20 20 20 20 20 74 68 69 73 2e 50 61 72          this.Par
221b0 61 6e 74 68 65 73 69 7a 65 45 78 70 72 65 73 73  anthesizeExpress
221c0 69 6f 6e 49 66 4e 65 65 64 65 64 28 76 61 6c 75  ionIfNeeded(valu
221d0 65 2c 20 73 71 6c 42 75 69 6c 64 65 72 29 3b 0d  e, sqlBuilder);.
221e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
221f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 72 69      }....    pri
22200 76 61 74 65 20 76 6f 69 64 20 50 61 72 61 6e 74  vate void Parant
22210 68 65 73 69 7a 65 45 78 70 72 65 73 73 69 6f 6e  hesizeExpression
22220 49 66 4e 65 65 64 65 64 28 44 62 45 78 70 72 65  IfNeeded(DbExpre
22230 73 73 69 6f 6e 20 65 2c 20 53 71 6c 42 75 69 6c  ssion e, SqlBuil
22240 64 65 72 20 72 65 73 75 6c 74 29 0d 0a 20 20 20  der result)..   
22250 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 28 49 73   {..      if (Is
22260 43 6f 6d 70 6c 65 78 45 78 70 72 65 73 73 69 6f  ComplexExpressio
22270 6e 28 65 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  n(e))..      {..
22280 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41          result.A
22290 70 70 65 6e 64 28 22 28 22 29 3b 0d 0a 20 20 20  ppend("(");..   
222a0 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
222b0 6e 64 28 65 2e 41 63 63 65 70 74 3c 49 53 71 6c  nd(e.Accept<ISql
222c0 46 72 61 67 6d 65 6e 74 3e 28 74 68 69 73 29 29  Fragment>(this))
222d0 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  ;..        resul
222e0 74 2e 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a  t.Append(")");..
222f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 65        }..      e
22300 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  lse..      {..  
22310 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70        result.App
22320 65 6e 64 28 65 2e 41 63 63 65 70 74 3c 49 53 71  end(e.Accept<ISq
22330 6c 46 72 61 67 6d 65 6e 74 3e 28 74 68 69 73 29  lFragment>(this)
22340 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
22350 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
22360 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
22370 20 57 65 20 75 73 65 20 74 68 65 20 6e 6f 72 6d   We use the norm
22380 61 6c 20 62 6f 78 20 71 75 6f 74 65 73 20 66 6f  al box quotes fo
22390 72 20 53 51 4c 20 73 65 72 76 65 72 2e 20 20 57  r SQL server.  W
223a0 65 20 64 6f 20 6e 6f 74 20 64 65 61 6c 20 77 69  e do not deal wi
223b0 74 68 20 41 4e 53 49 20 71 75 6f 74 65 73 0d 0a  th ANSI quotes..
223c0 20 20 20 20 2f 2f 2f 20 69 2e 65 2e 20 64 6f 75      /// i.e. dou
223d0 62 6c 65 20 71 75 6f 74 65 73 2e 0d 0a 20 20 20  ble quotes...   
223e0 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
223f0 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
22400 6e 61 6d 65 3d 22 6e 61 6d 65 22 3e 3c 2f 70 61  name="name"></pa
22410 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
22420 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73  eturns></returns
22430 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  >..    internal 
22440 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 51 75  static string Qu
22450 6f 74 65 49 64 65 6e 74 69 66 69 65 72 28 73 74  oteIdentifier(st
22460 72 69 6e 67 20 6e 61 6d 65 29 0d 0a 20 20 20 20  ring name)..    
22470 7b 0d 0a 20 20 20 20 20 20 44 65 62 75 67 2e 41  {..      Debug.A
22480 73 73 65 72 74 28 21 53 74 72 69 6e 67 2e 49 73  ssert(!String.Is
22490 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 6e 61 6d 65  NullOrEmpty(name
224a0 29 29 3b 0d 0a 20 20 20 20 20 20 2f 2f 20 57 65  ));..      // We
224b0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
224c0 20 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20 71   names are not q
224d0 75 6f 74 65 64 20 74 6f 20 62 65 67 69 6e 20 77  uoted to begin w
224e0 69 74 68 2e 0d 0a 20 20 20 20 20 20 72 65 74 75  ith...      retu
224f0 72 6e 20 22 5b 22 20 2b 20 6e 61 6d 65 2e 52 65  rn "[" + name.Re
22500 70 6c 61 63 65 28 22 5d 22 2c 20 22 5d 5d 22 29  place("]", "]]")
22510 20 2b 20 22 5d 22 3b 0d 0a 20 20 20 20 7d 0d 0a   + "]";..    }..
22520 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f  ..    private bo
22530 6f 6c 20 54 72 79 41 64 64 45 78 70 72 65 73 73  ol TryAddExpress
22540 69 6f 6e 46 6f 72 49 6e 28 44 62 42 69 6e 61 72  ionForIn(DbBinar
22550 79 45 78 70 72 65 73 73 69 6f 6e 20 65 2c 20 4b  yExpression e, K
22560 65 79 54 6f 4c 69 73 74 4d 61 70 3c 44 62 45 78  eyToListMap<DbEx
22570 70 72 65 73 73 69 6f 6e 2c 20 44 62 45 78 70 72  pression, DbExpr
22580 65 73 73 69 6f 6e 3e 20 76 61 6c 75 65 73 29 0d  ession> values).
22590 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66  .    {..      if
225a0 20 28 74 68 69 73 2e 49 73 4b 65 79 46 6f 72 49   (this.IsKeyForI
225b0 6e 28 65 2e 4c 65 66 74 29 29 0d 0a 20 20 20 20  n(e.Left))..    
225c0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 76 61 6c    {..        val
225d0 75 65 73 2e 41 64 64 28 65 2e 4c 65 66 74 2c 20  ues.Add(e.Left, 
225e0 65 2e 52 69 67 68 74 29 3b 0d 0a 20 20 20 20 20  e.Right);..     
225f0 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d     return true;.
22600 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
22610 69 66 20 28 74 68 69 73 2e 49 73 4b 65 79 46 6f  if (this.IsKeyFo
22620 72 49 6e 28 65 2e 52 69 67 68 74 29 29 0d 0a 20  rIn(e.Right)).. 
22630 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
22640 76 61 6c 75 65 73 2e 41 64 64 28 65 2e 52 69 67  values.Add(e.Rig
22650 68 74 2c 20 65 2e 4c 65 66 74 29 3b 0d 0a 20 20  ht, e.Left);..  
22660 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
22670 65 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  e;..      }..   
22680 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
22690 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
226a0 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
226b0 20 20 2f 2f 2f 20 53 69 6d 70 6c 79 20 63 61 6c    /// Simply cal
226c0 6c 73 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69  ls <see cref="Vi
226d0 73 69 74 45 78 70 72 65 73 73 69 6f 6e 45 6e 73  sitExpressionEns
226e0 75 72 65 53 71 6c 53 74 61 74 65 6d 65 6e 74 28  ureSqlStatement(
226f0 44 62 45 78 70 72 65 73 73 69 6f 6e 2c 20 62 6f  DbExpression, bo
22700 6f 6c 29 22 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20  ol)"/>..    /// 
22710 77 69 74 68 20 61 64 64 44 65 66 61 75 6c 74 43  with addDefaultC
22720 6f 6c 75 6d 6e 73 20 73 65 74 20 74 6f 20 74 72  olumns set to tr
22730 75 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ue..    /// </su
22740 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
22750 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e  <param name="e">
22760 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
22770 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74  / <returns></ret
22780 75 72 6e 73 3e 0d 0a 20 20 20 20 53 71 6c 53 65  urns>..    SqlSe
22790 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 20 56 69  lectStatement Vi
227a0 73 69 74 45 78 70 72 65 73 73 69 6f 6e 45 6e 73  sitExpressionEns
227b0 75 72 65 53 71 6c 53 74 61 74 65 6d 65 6e 74 28  ureSqlStatement(
227c0 44 62 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d  DbExpression e).
227d0 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
227e0 74 75 72 6e 20 56 69 73 69 74 45 78 70 72 65 73  turn VisitExpres
227f0 73 69 6f 6e 45 6e 73 75 72 65 53 71 6c 53 74 61  sionEnsureSqlSta
22800 74 65 6d 65 6e 74 28 65 2c 20 74 72 75 65 29 3b  tement(e, true);
22810 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
22820 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
22830 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 63 61    /// This is ca
22840 6c 6c 65 64 20 66 72 6f 6d 20 3c 73 65 65 20 63  lled from <see c
22850 72 65 66 3d 22 47 65 6e 65 72 61 74 65 53 71 6c  ref="GenerateSql
22860 28 44 62 51 75 65 72 79 43 6f 6d 6d 61 6e 64 54  (DbQueryCommandT
22870 72 65 65 29 22 2f 3e 20 61 6e 64 20 6e 6f 64 65  ree)"/> and node
22880 73 20 77 68 69 63 68 20 72 65 71 75 69 72 65 20  s which require 
22890 61 0d 0a 20 20 20 20 2f 2f 2f 20 73 65 6c 65 63  a..    /// selec
228a0 74 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 61  t statement as a
228b0 6e 20 61 72 67 75 6d 65 6e 74 20 65 2e 67 2e 20  n argument e.g. 
228c0 3c 73 65 65 20 63 72 65 66 3d 22 56 69 73 69 74  <see cref="Visit
228d0 28 44 62 49 73 45 6d 70 74 79 45 78 70 72 65 73  (DbIsEmptyExpres
228e0 73 69 6f 6e 29 22 2f 3e 2c 0d 0a 20 20 20 20 2f  sion)"/>,..    /
228f0 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 56 69  // <see cref="Vi
22900 73 69 74 28 44 62 55 6e 69 6f 6e 41 6c 6c 45 78  sit(DbUnionAllEx
22910 70 72 65 73 73 69 6f 6e 29 22 2f 3e 2e 0d 0a 20  pression)"/>... 
22920 20 20 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20     ///..    /// 
22930 53 71 6c 47 65 6e 65 72 61 74 6f 72 20 6e 65 65  SqlGenerator nee
22940 64 73 20 69 74 73 20 63 68 69 6c 64 20 74 6f 20  ds its child to 
22950 68 61 76 65 20 61 20 70 72 6f 70 65 72 20 61 6c  have a proper al
22960 69 61 73 20 69 66 20 74 68 65 20 63 68 69 6c 64  ias if the child
22970 20 69 73 0d 0a 20 20 20 20 2f 2f 2f 20 6a 75 73   is..    /// jus
22980 74 20 61 6e 20 65 78 74 65 6e 74 20 6f 72 20 61  t an extent or a
22990 20 6a 6f 69 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 0d   join...    ///.
229a0 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 6f 72  .    /// The nor
229b0 6d 61 6c 20 72 65 6c 61 74 69 6f 6e 61 6c 20 6e  mal relational n
229c0 6f 64 65 73 20 72 65 73 75 6c 74 20 69 6e 20 63  odes result in c
229d0 6f 6d 70 6c 65 74 65 20 76 61 6c 69 64 20 53 51  omplete valid SQ
229e0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20  L statements... 
229f0 20 20 20 2f 2f 2f 20 46 6f 72 20 74 68 65 20 72     /// For the r
22a00 65 73 74 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  est, we need to 
22a10 74 72 65 61 74 20 74 68 65 6d 20 61 73 20 74 68  treat them as th
22a20 65 72 65 20 77 61 73 20 61 20 64 75 6d 6d 79 0d  ere was a dummy.
22a30 0a 20 20 20 20 2f 2f 2f 20 3c 63 6f 64 65 3e 0d  .    /// <code>.
22a40 0a 20 20 20 20 2f 2f 2f 20 2d 2d 20 6f 72 69 67  .    /// -- orig
22a50 69 6e 61 6c 6c 79 20 7b 65 78 70 72 65 73 73 69  inally {expressi
22a60 6f 6e 7d 0d 0a 20 20 20 20 2f 2f 2f 20 2d 2d 20  on}..    /// -- 
22a70 63 68 61 6e 67 65 20 74 68 61 74 20 74 6f 0d 0a  change that to..
22a80 20 20 20 20 2f 2f 2f 20 53 45 4c 45 43 54 20 2a      /// SELECT *
22a90 0d 0a 20 20 20 20 2f 2f 2f 20 46 52 4f 4d 20 7b  ..    /// FROM {
22aa0 65 78 70 72 65 73 73 69 6f 6e 7d 20 61 73 20 63  expression} as c
22ab0 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f 64 65  ..    /// </code
22ac0 3e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a 20 20 20 20  >..    ///..    
22ad0 2f 2f 2f 20 44 62 4c 69 6d 69 74 45 78 70 72 65  /// DbLimitExpre
22ae0 73 73 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 73  ssion needs to s
22af0 74 61 72 74 20 74 68 65 20 73 74 61 74 65 6d 65  tart the stateme
22b00 6e 74 20 62 75 74 20 6e 6f 74 20 61 64 64 20 74  nt but not add t
22b10 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 75 6d  he default colum
22b20 6e 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ns..    /// </su
22b30 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
22b40 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 22 3e  <param name="e">
22b50 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
22b60 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61  / <param name="a
22b70 64 64 44 65 66 61 75 6c 74 43 6f 6c 75 6d 6e 73  ddDefaultColumns
22b80 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  "></param>..    
22b90 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72  /// <returns></r
22ba0 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 53 71 6c  eturns>..    Sql
22bb0 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74 20  SelectStatement 
22bc0 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 45  VisitExpressionE
22bd0 6e 73 75 72 65 53 71 6c 53 74 61 74 65 6d 65 6e  nsureSqlStatemen
22be0 74 28 44 62 45 78 70 72 65 73 73 69 6f 6e 20 65  t(DbExpression e
22bf0 2c 20 62 6f 6f 6c 20 61 64 64 44 65 66 61 75 6c  , bool addDefaul
22c00 74 43 6f 6c 75 6d 6e 73 29 0d 0a 20 20 20 20 7b  tColumns)..    {
22c10 0d 0a 20 20 20 20 20 20 44 65 62 75 67 2e 41 73  ..      Debug.As
22c20 73 65 72 74 28 4d 65 74 61 64 61 74 61 48 65 6c  sert(MetadataHel
22c30 70 65 72 73 2e 49 73 43 6f 6c 6c 65 63 74 69 6f  pers.IsCollectio
22c40 6e 54 79 70 65 28 65 2e 52 65 73 75 6c 74 54 79  nType(e.ResultTy
22c50 70 65 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 53  pe));....      S
22c60 71 6c 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e  qlSelectStatemen
22c70 74 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 20  t result;..     
22c80 20 73 77 69 74 63 68 20 28 65 2e 45 78 70 72 65   switch (e.Expre
22c90 73 73 69 6f 6e 4b 69 6e 64 29 0d 0a 20 20 20 20  ssionKind)..    
22ca0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 61 73    {..        cas
22cb0 65 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69  e DbExpressionKi
22cc0 6e 64 2e 50 72 6f 6a 65 63 74 3a 0d 0a 20 20 20  nd.Project:..   
22cd0 20 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72       case DbExpr
22ce0 65 73 73 69 6f 6e 4b 69 6e 64 2e 46 69 6c 74 65  essionKind.Filte
22cf0 72 3a 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65  r:..        case
22d00 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e   DbExpressionKin
22d10 64 2e 47 72 6f 75 70 42 79 3a 0d 0a 20 20 20 20  d.GroupBy:..    
22d20 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65      case DbExpre
22d30 73 73 69 6f 6e 4b 69 6e 64 2e 53 6f 72 74 3a 0d  ssionKind.Sort:.
22d40 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c  .          resul
22d50 74 20 3d 20 65 2e 41 63 63 65 70 74 28 74 68 69  t = e.Accept(thi
22d60 73 29 20 61 73 20 53 71 6c 53 65 6c 65 63 74 53  s) as SqlSelectS
22d70 74 61 74 65 6d 65 6e 74 3b 0d 0a 20 20 20 20 20  tatement;..     
22d80 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 0d 0a 20       break;.... 
22d90 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0d         default:.
22da0 0a 20 20 20 20 20 20 20 20 20 20 53 79 6d 62 6f  .          Symbo
22db0 6c 20 66 72 6f 6d 53 79 6d 62 6f 6c 3b 0d 0a 20  l fromSymbol;.. 
22dc0 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
22dd0 69 6e 70 75 74 56 61 72 4e 61 6d 65 20 3d 20 22  inputVarName = "
22de0 63 22 3b 20 20 2f 2f 20 61 6e 79 20 6e 61 6d 65  c";  // any name
22df0 20 77 69 6c 6c 20 64 6f 20 2d 20 74 68 69 73 20   will do - this 
22e00 69 73 20 6d 79 20 72 61 6e 64 6f 6d 20 63 68 6f  is my random cho
22e10 69 63 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ice...          
22e20 73 79 6d 62 6f 6c 54 61 62 6c 65 2e 45 6e 74 65  symbolTable.Ente
22e30 72 53 63 6f 70 65 28 29 3b 0d 0a 0d 0a 20 20 20  rScope();....   
22e40 20 20 20 20 20 20 20 54 79 70 65 55 73 61 67 65         TypeUsage
22e50 20 74 79 70 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 20   type = null;.. 
22e60 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
22e70 28 65 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e  (e.ExpressionKin
22e80 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  d)..          {.
22e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
22ea0 65 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b 69  e DbExpressionKi
22eb0 6e 64 2e 53 63 61 6e 3a 0d 0a 20 20 20 20 20 20  nd.Scan:..      
22ec0 20 20 20 20 20 20 63 61 73 65 20 44 62 45 78 70        case DbExp
22ed0 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 43 72 6f 73  ressionKind.Cros
22ee0 73 4a 6f 69 6e 3a 0d 0a 20 20 20 20 20 20 20 20  sJoin:..        
22ef0 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65      case DbExpre
22f00 73 73 69 6f 6e 4b 69 6e 64 2e 46 75 6c 6c 4f 75  ssionKind.FullOu
22f10 74 65 72 4a 6f 69 6e 3a 0d 0a 20 20 20 20 20 20  terJoin:..      
22f20 20 20 20 20 20 20 63 61 73 65 20 44 62 45 78 70        case DbExp
22f30 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 49 6e 6e 65  ressionKind.Inne
22f40 72 4a 6f 69 6e 3a 0d 0a 20 20 20 20 20 20 20 20  rJoin:..        
22f50 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65      case DbExpre
22f60 73 73 69 6f 6e 4b 69 6e 64 2e 4c 65 66 74 4f 75  ssionKind.LeftOu
22f70 74 65 72 4a 6f 69 6e 3a 0d 0a 20 20 20 20 20 20  terJoin:..      
22f80 20 20 20 20 20 20 63 61 73 65 20 44 62 45 78 70        case DbExp
22f90 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 43 72 6f 73  ressionKind.Cros
22fa0 73 41 70 70 6c 79 3a 0d 0a 20 20 20 20 20 20 20  sApply:..       
22fb0 20 20 20 20 20 63 61 73 65 20 44 62 45 78 70 72       case DbExpr
22fc0 65 73 73 69 6f 6e 4b 69 6e 64 2e 4f 75 74 65 72  essionKind.Outer
22fd0 41 70 70 6c 79 3a 0d 0a 20 20 20 20 20 20 20 20  Apply:..        
22fe0 20 20 20 20 20 20 74 79 70 65 20 3d 20 4d 65 74        type = Met
22ff0 61 64 61 74 61 48 65 6c 70 65 72 73 2e 47 65 74  adataHelpers.Get
23000 45 6c 65 6d 65 6e 74 54 79 70 65 55 73 61 67 65  ElementTypeUsage
23010 28 65 2e 52 65 73 75 6c 74 54 79 70 65 29 3b 0d  (e.ResultType);.
23020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
23030 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  reak;....       
23040 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20       default:.. 
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 44 65 62               Deb
23060 75 67 2e 41 73 73 65 72 74 28 4d 65 74 61 64 61  ug.Assert(Metada
23070 74 61 48 65 6c 70 65 72 73 2e 49 73 43 6f 6c 6c  taHelpers.IsColl
23080 65 63 74 69 6f 6e 54 79 70 65 28 65 2e 52 65 73  ectionType(e.Res
23090 75 6c 74 54 79 70 65 29 29 3b 0d 0a 20 20 20 20  ultType));..    
230a0 20 20 20 20 20 20 20 20 20 20 74 79 70 65 20 3d            type =
230b0 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73   MetadataHelpers
230c0 2e 47 65 74 45 64 6d 54 79 70 65 3c 43 6f 6c 6c  .GetEdmType<Coll
230d0 65 63 74 69 6f 6e 54 79 70 65 3e 28 65 2e 52 65  ectionType>(e.Re
230e0 73 75 6c 74 54 79 70 65 29 2e 54 79 70 65 55 73  sultType).TypeUs
230f0 61 67 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  age;..          
23100 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
23110 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23120 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 56 69       result = Vi
23130 73 69 74 49 6e 70 75 74 45 78 70 72 65 73 73 69  sitInputExpressi
23140 6f 6e 28 65 2c 20 69 6e 70 75 74 56 61 72 4e 61  on(e, inputVarNa
23150 6d 65 2c 20 74 79 70 65 2c 20 6f 75 74 20 66 72  me, type, out fr
23160 6f 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20  omSymbol);..    
23170 20 20 20 20 20 20 41 64 64 46 72 6f 6d 53 79 6d        AddFromSym
23180 62 6f 6c 28 72 65 73 75 6c 74 2c 20 69 6e 70 75  bol(result, inpu
23190 74 56 61 72 4e 61 6d 65 2c 20 66 72 6f 6d 53 79  tVarName, fromSy
231a0 6d 62 6f 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20  mbol);..        
231b0 20 20 73 79 6d 62 6f 6c 54 61 62 6c 65 2e 45 78    symbolTable.Ex
231c0 69 74 53 63 6f 70 65 28 29 3b 0d 0a 20 20 20 20  itScope();..    
231d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
231e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
231f0 66 20 28 61 64 64 44 65 66 61 75 6c 74 43 6f 6c  f (addDefaultCol
23200 75 6d 6e 73 20 26 26 20 72 65 73 75 6c 74 2e 53  umns && result.S
23210 65 6c 65 63 74 2e 49 73 45 6d 70 74 79 29 0d 0a  elect.IsEmpty)..
23220 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
23230 20 41 64 64 44 65 66 61 75 6c 74 43 6f 6c 75 6d   AddDefaultColum
23240 6e 73 28 72 65 73 75 6c 74 29 3b 0d 0a 20 20 20  ns(result);..   
23250 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
23260 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20  turn result;..  
23270 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
23280 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
23290 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73  / This method is
232a0 20 63 61 6c 6c 65 64 20 62 79 20 3c 73 65 65 20   called by <see 
232b0 63 72 65 66 3d 22 56 69 73 69 74 28 44 62 46 69  cref="Visit(DbFi
232c0 6c 74 65 72 45 78 70 72 65 73 73 69 6f 6e 29 22  lterExpression)"
232d0 2f 3e 20 61 6e 64 0d 0a 20 20 20 20 2f 2f 2f 20  /> and..    /// 
232e0 3c 73 65 65 20 63 72 65 66 3d 22 56 69 73 69 74  <see cref="Visit
232f0 28 44 62 51 75 61 6e 74 69 66 69 65 72 45 78 70  (DbQuantifierExp
23300 72 65 73 73 69 6f 6e 29 22 2f 3e 0d 0a 20 20 20  ression)"/>..   
23310 20 2f 2f 2f 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f   ///..    /// </
23320 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
23330 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
23340 6e 70 75 74 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  nput"></param>..
23350 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
23360 61 6d 65 3d 22 70 72 65 64 69 63 61 74 65 22 3e  ame="predicate">
23370 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
23380 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e  / <param name="n
23390 65 67 61 74 65 50 72 65 64 69 63 61 74 65 22 3e  egatePredicate">
233a0 54 68 69 73 20 69 73 20 70 61 73 73 65 64 20 66  This is passed f
233b0 72 6f 6d 20 3c 73 65 65 20 63 72 65 66 3d 22 56  rom <see cref="V
233c0 69 73 69 74 28 44 62 51 75 61 6e 74 69 66 69 65  isit(DbQuantifie
233d0 72 45 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e 0d  rExpression)"/>.
233e0 0a 20 20 20 20 2f 2f 2f 20 69 6e 20 74 68 65 20  .    /// in the 
233f0 41 6c 6c 28 2e 2e 2e 29 20 63 61 73 65 2e 3c 2f  All(...) case.</
23400 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
23410 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72  <returns></retur
23420 6e 73 3e 0d 0a 20 20 20 20 53 71 6c 53 65 6c 65  ns>..    SqlSele
23430 63 74 53 74 61 74 65 6d 65 6e 74 20 56 69 73 69  ctStatement Visi
23440 74 46 69 6c 74 65 72 45 78 70 72 65 73 73 69 6f  tFilterExpressio
23450 6e 28 44 62 45 78 70 72 65 73 73 69 6f 6e 42 69  n(DbExpressionBi
23460 6e 64 69 6e 67 20 69 6e 70 75 74 2c 20 44 62 45  nding input, DbE
23470 78 70 72 65 73 73 69 6f 6e 20 70 72 65 64 69 63  xpression predic
23480 61 74 65 2c 20 62 6f 6f 6c 20 6e 65 67 61 74 65  ate, bool negate
23490 50 72 65 64 69 63 61 74 65 29 0d 0a 20 20 20 20  Predicate)..    
234a0 7b 0d 0a 20 20 20 20 20 20 53 79 6d 62 6f 6c 20  {..      Symbol 
234b0 66 72 6f 6d 53 79 6d 62 6f 6c 3b 0d 0a 20 20 20  fromSymbol;..   
234c0 20 20 20 53 71 6c 53 65 6c 65 63 74 53 74 61 74     SqlSelectStat
234d0 65 6d 65 6e 74 20 72 65 73 75 6c 74 20 3d 20 56  ement result = V
234e0 69 73 69 74 49 6e 70 75 74 45 78 70 72 65 73 73  isitInputExpress
234f0 69 6f 6e 28 69 6e 70 75 74 2e 45 78 70 72 65 73  ion(input.Expres
23500 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  sion,..         
23510 20 69 6e 70 75 74 2e 56 61 72 69 61 62 6c 65 4e   input.VariableN
23520 61 6d 65 2c 20 69 6e 70 75 74 2e 56 61 72 69 61  ame, input.Varia
23530 62 6c 65 54 79 70 65 2c 20 6f 75 74 20 66 72 6f  bleType, out fro
23540 6d 53 79 6d 62 6f 6c 29 3b 0d 0a 0d 0a 20 20 20  mSymbol);....   
23550 20 20 20 2f 2f 20 46 69 6c 74 65 72 20 69 73 20     // Filter is 
23560 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
23570 4f 72 64 65 72 42 79 0d 0a 20 20 20 20 20 20 2f  OrderBy..      /
23580 2f 20 62 75 74 20 6e 6f 74 20 77 69 74 68 20 50  / but not with P
23590 72 6f 6a 65 63 74 2c 20 61 6e 6f 74 68 65 72 20  roject, another 
235a0 46 69 6c 74 65 72 20 6f 72 20 47 72 6f 75 70 42  Filter or GroupB
235b0 79 0d 0a 20 20 20 20 20 20 69 66 20 28 21 49 73  y..      if (!Is
235c0 43 6f 6d 70 61 74 69 62 6c 65 28 72 65 73 75 6c  Compatible(resul
235d0 74 2c 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b  t, DbExpressionK
235e0 69 6e 64 2e 46 69 6c 74 65 72 29 29 0d 0a 20 20  ind.Filter))..  
235f0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72      {..        r
23600 65 73 75 6c 74 20 3d 20 43 72 65 61 74 65 4e 65  esult = CreateNe
23610 77 53 65 6c 65 63 74 53 74 61 74 65 6d 65 6e 74  wSelectStatement
23620 28 72 65 73 75 6c 74 2c 20 69 6e 70 75 74 2e 56  (result, input.V
23630 61 72 69 61 62 6c 65 4e 61 6d 65 2c 20 69 6e 70  ariableName, inp
23640 75 74 2e 56 61 72 69 61 62 6c 65 54 79 70 65 2c  ut.VariableType,
23650 20 6f 75 74 20 66 72 6f 6d 53 79 6d 62 6f 6c 29   out fromSymbol)
23660 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
23670 20 20 20 20 73 65 6c 65 63 74 53 74 61 74 65 6d      selectStatem
23680 65 6e 74 53 74 61 63 6b 2e 50 75 73 68 28 72 65  entStack.Push(re
23690 73 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20 73 79  sult);..      sy
236a0 6d 62 6f 6c 54 61 62 6c 65 2e 45 6e 74 65 72 53  mbolTable.EnterS
236b0 63 6f 70 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  cope();....     
236c0 20 41 64 64 46 72 6f 6d 53 79 6d 62 6f 6c 28 72   AddFromSymbol(r
236d0 65 73 75 6c 74 2c 20 69 6e 70 75 74 2e 56 61 72  esult, input.Var
236e0 69 61 62 6c 65 4e 61 6d 65 2c 20 66 72 6f 6d 53  iableName, fromS
236f0 79 6d 62 6f 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20  ymbol);....     
23700 20 69 66 20 28 6e 65 67 61 74 65 50 72 65 64 69   if (negatePredi
23710 63 61 74 65 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  cate)..      {..
23720 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 57          result.W
23730 68 65 72 65 2e 41 70 70 65 6e 64 28 22 4e 4f 54  here.Append("NOT
23740 20 28 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a   (");..      }..
23750 20 20 20 20 20 20 72 65 73 75 6c 74 2e 57 68 65        result.Whe
23760 72 65 2e 41 70 70 65 6e 64 28 70 72 65 64 69 63  re.Append(predic
23770 61 74 65 2e 41 63 63 65 70 74 28 74 68 69 73 29  ate.Accept(this)
23780 29 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 6e 65  );..      if (ne
23790 67 61 74 65 50 72 65 64 69 63 61 74 65 29 0d 0a  gatePredicate)..
237a0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
237b0 20 72 65 73 75 6c 74 2e 57 68 65 72 65 2e 41 70   result.Where.Ap
237c0 70 65 6e 64 28 22 29 22 29 3b 0d 0a 20 20 20 20  pend(")");..    
237d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 79 6d    }....      sym
237e0 62 6f 6c 54 61 62 6c 65 2e 45 78 69 74 53 63 6f  bolTable.ExitSco
237f0 70 65 28 29 3b 0d 0a 20 20 20 20 20 20 73 65 6c  pe();..      sel
23800 65 63 74 53 74 61 74 65 6d 65 6e 74 53 74 61 63  ectStatementStac
23810 6b 2e 50 6f 70 28 29 3b 0d 0a 0d 0a 20 20 20 20  k.Pop();....    
23820 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
23830 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
23840 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
23850 20 20 2f 2f 2f 20 49 66 20 74 68 65 20 73 71 6c    /// If the sql
23860 20 66 72 61 67 6d 65 6e 74 20 66 6f 72 20 61 6e   fragment for an
23870 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
23880 6e 20 69 73 20 6e 6f 74 20 61 20 53 71 6c 53 65  n is not a SqlSe
23890 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 0d 0a  lect statement..
238a0 20 20 20 20 2f 2f 2f 20 6f 72 20 6f 74 68 65 72      /// or other
238b0 20 61 63 63 65 70 74 61 62 6c 65 20 66 6f 72 6d   acceptable form
238c0 20 28 65 2e 67 2e 20 61 6e 20 65 78 74 65 6e 74   (e.g. an extent
238d0 20 61 73 20 61 20 53 71 6c 42 75 69 6c 64 65 72   as a SqlBuilder
238e0 29 2c 20 77 65 20 6e 65 65 64 0d 0a 20 20 20 20  ), we need..    
238f0 2f 2f 2f 20 74 6f 20 77 72 61 70 20 69 74 20 69  /// to wrap it i
23900 6e 20 61 20 66 6f 72 6d 20 61 63 63 65 70 74 61  n a form accepta
23910 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20 63 6c  ble in a FROM cl
23920 61 75 73 65 2e 20 20 54 68 65 73 65 20 61 72 65  ause.  These are
23930 0d 0a 20 20 20 20 2f 2f 2f 20 70 72 69 6d 61 72  ..    /// primar
23940 69 6c 79 20 74 68 65 0d 0a 20 20 20 20 2f 2f 2f  ily the..    ///
23950 20 3c 6c 69 73 74 20 74 79 70 65 3d 22 62 75 6c   <list type="bul
23960 6c 65 74 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  let">..    /// <
23970 69 74 65 6d 3e 54 68 65 20 73 65 74 20 6f 70 65  item>The set ope
23980 72 61 74 69 6f 6e 20 65 78 70 72 65 73 73 69 6f  ration expressio
23990 6e 73 20 2d 20 75 6e 69 6f 6e 20 61 6c 6c 2c 20  ns - union all, 
239a0 69 6e 74 65 72 73 65 63 74 2c 20 65 78 63 65 70  intersect, excep
239b0 74 3c 2f 69 74 65 6d 3e 0d 0a 20 20 20 20 2f 2f  t</item>..    //
239c0 2f 20 3c 69 74 65 6d 3e 54 56 46 73 2c 20 77 68  / <item>TVFs, wh
239d0 69 63 68 20 61 72 65 20 63 6f 6e 63 65 70 74 75  ich are conceptu
239e0 61 6c 6c 79 20 73 69 6d 69 6c 61 72 20 74 6f 20  ally similar to 
239f0 74 61 62 6c 65 73 3c 2f 69 74 65 6d 3e 0d 0a 20  tables</item>.. 
23a00 20 20 20 2f 2f 2f 20 3c 2f 6c 69 73 74 3e 0d 0a     /// </list>..
23a10 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
23a20 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  y>..    /// <par
23a30 61 6d 20 6e 61 6d 65 3d 22 72 65 73 75 6c 74 22  am name="result"
23a40 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  ></param>..    /
23a50 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
23a60 73 71 6c 46 72 61 67 6d 65 6e 74 22 3e 3c 2f 70  sqlFragment"></p
23a70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
23a80 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 78 70 72  param name="expr
23a90 65 73 73 69 6f 6e 4b 69 6e 64 22 3e 3c 2f 70 61  essionKind"></pa
23aa0 72 61 6d 3e 0d 0a 20 20 20 20 76 6f 69 64 20 57  ram>..    void W
23ab0 72 61 70 4e 6f 6e 51 75 65 72 79 45 78 74 65 6e  rapNonQueryExten
23ac0 74 28 53 71 6c 53 65 6c 65 63 74 53 74 61 74 65  t(SqlSelectState
23ad0 6d 65 6e 74 20 72 65 73 75 6c 74 2c 20 49 53 71  ment result, ISq
23ae0 6c 46 72 61 67 6d 65 6e 74 20 73 71 6c 46 72 61  lFragment sqlFra
23af0 67 6d 65 6e 74 2c 20 44 62 45 78 70 72 65 73 73  gment, DbExpress
23b00 69 6f 6e 4b 69 6e 64 20 65 78 70 72 65 73 73 69  ionKind expressi
23b10 6f 6e 4b 69 6e 64 29 0d 0a 20 20 20 20 7b 0d 0a  onKind)..    {..
23b20 20 20 20 20 20 20 73 77 69 74 63 68 20 28 65 78        switch (ex
23b30 70 72 65 73 73 69 6f 6e 4b 69 6e 64 29 0d 0a 20  pressionKind).. 
23b40 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
23b50 63 61 73 65 20 44 62 45 78 70 72 65 73 73 69 6f  case DbExpressio
23b60 6e 4b 69 6e 64 2e 46 75 6e 63 74 69 6f 6e 3a 0d  nKind.Function:.
23b70 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54 56  .          // TV
23b80 46 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  F..          res
23b90 75 6c 74 2e 46 72 6f 6d 2e 41 70 70 65 6e 64 28  ult.From.Append(
23ba0 73 71 6c 46 72 61 67 6d 65 6e 74 29 3b 0d 0a 20  sqlFragment);.. 
23bb0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d           break;.
23bc0 0a 0d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  ...        defau
23bd0 6c 74 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  lt:..          r
23be0 65 73 75 6c 74 2e 46 72 6f 6d 2e 41 70 70 65 6e  esult.From.Appen
23bf0 64 28 22 20 28 22 29 3b 0d 0a 20 20 20 20 20 20  d(" (");..      
23c00 20 20 20 20 72 65 73 75 6c 74 2e 46 72 6f 6d 2e      result.From.
23c10 41 70 70 65 6e 64 28 73 71 6c 46 72 61 67 6d 65  Append(sqlFragme
23c20 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nt);..          
23c30 72 65 73 75 6c 74 2e 46 72 6f 6d 2e 41 70 70 65  result.From.Appe
23c40 6e 64 28 22 29 22 29 3b 0d 0a 20 20 20 20 20 20  nd(")");..      
23c50 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
23c60 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
23c70 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
23c80 0a 20 20 20 20 2f 2f 2f 20 49 73 20 74 68 69 73  .    /// Is this
23c90 20 61 20 62 75 69 6c 74 69 6e 20 66 75 6e 63 74   a builtin funct
23ca0 69 6f 6e 20 28 69 65 29 20 64 6f 65 73 20 69 74  ion (ie) does it
23cb0 20 68 61 76 65 20 74 68 65 20 62 75 69 6c 74 69   have the builti
23cc0 6e 41 74 74 72 69 62 75 74 65 20 73 70 65 63 69  nAttribute speci
23cd0 66 69 65 64 3f 0d 0a 20 20 20 20 2f 2f 2f 20 3c  fied?..    /// <
23ce0 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
23cf0 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
23d00 66 75 6e 63 74 69 6f 6e 22 3e 3c 2f 70 61 72 61  function"></para
23d10 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
23d20 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d  urns></returns>.
23d30 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
23d40 74 69 63 20 62 6f 6f 6c 20 49 73 42 75 69 6c 74  tic bool IsBuilt
23d50 69 6e 46 75 6e 63 74 69 6f 6e 28 45 64 6d 46 75  inFunction(EdmFu
23d60 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 29  nction function)
23d70 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72  ..    {..      r
23d80 65 74 75 72 6e 20 4d 65 74 61 64 61 74 61 48 65  eturn MetadataHe
23d90 6c 70 65 72 73 2e 54 72 79 47 65 74 56 61 6c 75  lpers.TryGetValu
23da0 65 46 6f 72 4d 65 74 61 64 61 74 61 50 72 6f 70  eForMetadataProp
23db0 65 72 74 79 3c 62 6f 6f 6c 3e 28 66 75 6e 63 74  erty<bool>(funct
23dc0 69 6f 6e 2c 20 22 42 75 69 6c 74 49 6e 41 74 74  ion, "BuiltInAtt
23dd0 72 69 62 75 74 65 22 29 3b 0d 0a 20 20 20 20 7d  ribute");..    }
23de0 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
23df0 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 0d 0a  mary>..    ///..
23e00 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
23e10 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  y>..    /// <par
23e20 61 6d 20 6e 61 6d 65 3d 22 66 75 6e 63 74 69 6f  am name="functio
23e30 6e 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  n"></param>..   
23e40 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
23e50 3d 22 72 65 73 75 6c 74 22 3e 3c 2f 70 61 72 61  ="result"></para
23e60 6d 3e 0d 0a 20 20 20 20 76 6f 69 64 20 57 72 69  m>..    void Wri
23e70 74 65 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 53  teFunctionName(S
23e80 71 6c 42 75 69 6c 64 65 72 20 72 65 73 75 6c 74  qlBuilder result
23e90 2c 20 45 64 6d 46 75 6e 63 74 69 6f 6e 20 66 75  , EdmFunction fu
23ea0 6e 63 74 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a  nction)..    {..
23eb0 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 74 6f        string sto
23ec0 72 65 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 20 3d  reFunctionName =
23ed0 20 4d 65 74 61 64 61 74 61 48 65 6c 70 65 72 73   MetadataHelpers
23ee0 2e 54 72 79 47 65 74 56 61 6c 75 65 46 6f 72 4d  .TryGetValueForM
23ef0 65 74 61 64 61 74 61 50 72 6f 70 65 72 74 79 3c  etadataProperty<
23f00 73 74 72 69 6e 67 3e 28 66 75 6e 63 74 69 6f 6e  string>(function
23f10 2c 20 22 53 74 6f 72 65 46 75 6e 63 74 69 6f 6e  , "StoreFunction
23f20 4e 61 6d 65 41 74 74 72 69 62 75 74 65 22 29 3b  NameAttribute");
23f30 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 73 74  ....      if (st
23f40 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70  ring.IsNullOrEmp
23f50 74 79 28 73 74 6f 72 65 46 75 6e 63 74 69 6f 6e  ty(storeFunction
23f60 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 7b 0d  Name))..      {.
23f70 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 46 75  .        storeFu
23f80 6e 63 74 69 6f 6e 4e 61 6d 65 20 3d 20 66 75 6e  nctionName = fun
23f90 63 74 69 6f 6e 2e 4e 61 6d 65 3b 0d 0a 20 20 20  ction.Name;..   
23fa0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f     }....      //
23fb0 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
23fc0 20 69 73 20 61 20 62 75 69 6c 74 69 6e 20 28 69   is a builtin (i
23fd0 65 29 20 74 68 65 20 42 75 69 6c 74 49 6e 20 61  e) the BuiltIn a
23fe0 74 74 72 69 62 75 74 65 20 68 61 73 20 62 65 65  ttribute has bee
23ff0 6e 0d 0a 20 20 20 20 20 20 2f 2f 20 73 70 65 63  n..      // spec
24000 69 66 69 65 64 2c 20 74 68 65 6e 2c 20 74 68 65  ified, then, the
24010 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 73   function name s
24020 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 71 75 6f  hould not be quo
24030 74 65 64 3b 20 61 64 64 69 74 69 6f 6e 61 6c 6c  ted; additionall
24040 79 2c 0d 0a 20 20 20 20 20 20 2f 2f 20 6e 6f 20  y,..      // no 
24050 6e 61 6d 65 73 70 61 63 65 20 73 68 6f 75 6c 64  namespace should
24060 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
24070 20 69 66 20 28 49 73 42 75 69 6c 74 69 6e 46 75   if (IsBuiltinFu
24080 6e 63 74 69 6f 6e 28 66 75 6e 63 74 69 6f 6e 29  nction(function)
24090 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
240a0 20 20 20 20 69 66 20 28 66 75 6e 63 74 69 6f 6e      if (function
240b0 2e 4e 61 6d 65 73 70 61 63 65 4e 61 6d 65 20 3d  .NamespaceName =
240c0 3d 20 22 45 64 6d 22 29 0d 0a 20 20 20 20 20 20  = "Edm")..      
240d0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73    {..          s
240e0 77 69 74 63 68 20 28 73 74 6f 72 65 46 75 6e 63  witch (storeFunc
240f0 74 69 6f 6e 4e 61 6d 65 2e 54 6f 55 70 70 65 72  tionName.ToUpper
24100 49 6e 76 61 72 69 61 6e 74 28 29 29 0d 0a 20 20  Invariant())..  
24110 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
24120 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0d         default:.
24130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
24140 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 73 74 6f  esult.Append(sto
24150 72 65 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 3b  reFunctionName);
24160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24170 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20  break;..        
24180 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7d    }....        }
24190 0d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a  ..        else..
241a0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
241b0 20 20 20 20 20 72 65 73 75 6c 74 2e 41 70 70 65       result.Appe
241c0 6e 64 28 73 74 6f 72 65 46 75 6e 63 74 69 6f 6e  nd(storeFunction
241d0 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  Name);..        
241e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  }....      }..  
241f0 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
24200 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 53 68  {..        // Sh
24210 6f 75 6c 64 20 77 65 20 61 63 74 75 61 6c 6c 79  ould we actually
24220 20 73 75 70 70 6f 72 74 20 74 68 69 73 3f 0d 0a   support this?..
24230 20 20 20 20 20 20 20 20 2f 2f 72 65 73 75 6c 74          //result
24240 2e 41 70 70 65 6e 64 28 51 75 6f 74 65 49 64 65  .Append(QuoteIde
24250 6e 74 69 66 69 65 72 28 28 73 74 72 69 6e 67 29  ntifier((string)
24260 66 75 6e 63 74 69 6f 6e 2e 4d 65 74 61 64 61 74  function.Metadat
24270 61 50 72 6f 70 65 72 74 69 65 73 5b 22 53 63 68  aProperties["Sch
24280 65 6d 61 22 5d 2e 56 61 6c 75 65 20 3f 3f 20 22  ema"].Value ?? "
24290 64 62 6f 22 29 29 3b 0d 0a 20 20 20 20 20 20 20  dbo"));..       
242a0 20 2f 2f 72 65 73 75 6c 74 2e 41 70 70 65 6e 64   //result.Append
242b0 28 22 2e 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  (".");..        
242c0 72 65 73 75 6c 74 2e 41 70 70 65 6e 64 28 51 75  result.Append(Qu
242d0 6f 74 65 49 64 65 6e 74 69 66 69 65 72 28 73 74  oteIdentifier(st
242e0 6f 72 65 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  oreFunctionName)
242f0 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
24300 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
24310 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
24320 20 41 70 70 65 6e 64 73 20 74 68 65 20 6c 69 74   Appends the lit
24330 65 72 61 6c 20 42 4c 4f 42 20 73 74 72 69 6e 67  eral BLOB string
24340 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
24350 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
24360 0d 0a 20 20 20 20 2f 2f 2f 20 62 79 74 65 20 61  ..    /// byte a
24370 72 72 61 79 20 74 6f 20 74 68 65 20 3c 73 65 65  rray to the <see
24380 20 63 72 65 66 3d 22 53 71 6c 42 75 69 6c 64 65   cref="SqlBuilde
24390 72 22 20 2f 3e 2e 0d 0a 20 20 20 20 2f 2f 2f 20  r" />...    /// 
243a0 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
243b0 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
243c0 22 62 79 74 65 73 22 3e 0d 0a 20 20 20 20 2f 2f  "bytes">..    //
243d0 2f 20 54 68 65 20 62 79 74 65 20 61 72 72 61 79  / The byte array
243e0 20 74 6f 20 62 65 20 66 6f 72 6d 61 74 74 65 64   to be formatted
243f0 20 61 73 20 61 20 6c 69 74 65 72 61 6c 20 42 4c   as a literal BL
24400 4f 42 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  OB string...    
24410 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
24420 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
24430 65 3d 22 62 75 69 6c 64 65 72 22 3e 0d 0a 20 20  e="builder">..  
24440 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20 63    /// The <see c
24450 72 65 66 3d 22 53 71 6c 42 75 69 6c 64 65 72 22  ref="SqlBuilder"
24460 20 2f 3e 20 6f 62 6a 65 63 74 20 74 6f 20 75 73   /> object to us
24470 65 2e 20 20 49 66 20 6e 75 6c 6c 2c 20 61 6e 20  e.  If null, an 
24480 65 78 63 65 70 74 69 6f 6e 0d 0a 20 20 20 20 2f  exception..    /
24490 2f 2f 20 77 69 6c 6c 20 62 65 20 74 68 72 6f 77  // will be throw
244a0 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  n...    /// </pa
244b0 72 61 6d 3e 0d 0a 20 20 20 20 70 72 69 76 61 74  ram>..    privat
244c0 65 20 73 74 61 74 69 63 20 76 6f 69 64 20 54 6f  e static void To
244d0 42 6c 6f 62 4c 69 74 65 72 61 6c 28 0d 0a 20 20  BlobLiteral(..  
244e0 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62 79 74        byte[] byt
244f0 65 73 2c 0d 0a 20 20 20 20 20 20 20 20 53 71 6c  es,..        Sql
24500 42 75 69 6c 64 65 72 20 62 75 69 6c 64 65 72 0d  Builder builder.
24510 0a 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20  .        )..    
24520 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 62  {..        if (b
24530 75 69 6c 64 65 72 20 3d 3d 20 6e 75 6c 6c 29 0d  uilder == null).
24540 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
24550 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 4e  ow new ArgumentN
24560 75 6c 6c 45 78 63 65 70 74 69 6f 6e 28 22 62 75  ullException("bu
24570 69 6c 64 65 72 22 29 3b 0d 0a 0d 0a 20 20 20 20  ilder");....    
24580 20 20 20 20 69 66 20 28 62 79 74 65 73 20 3d 3d      if (bytes ==
24590 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
245a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  {..            b
245b0 75 69 6c 64 65 72 2e 41 70 70 65 6e 64 28 22 4e  uilder.Append("N
245c0 55 4c 4c 22 29 3b 20 2f 2a 20 54 4f 44 4f 3a 20  ULL"); /* TODO: 
245d0 52 65 61 73 6f 6e 61 62 6c 65 3f 20 2a 2f 0d 0a  Reasonable? */..
245e0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
245f0 72 6e 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rn;..        }..
24600 0d 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 65  ..        builde
24610 72 2e 41 70 70 65 6e 64 28 22 20 58 27 22 29 3b  r.Append(" X'");
24620 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ....        for 
24630 28 69 6e 74 20 69 6e 64 65 78 20 3d 20 30 3b 20  (int index = 0; 
24640 69 6e 64 65 78 20 3c 20 62 79 74 65 73 2e 4c 65  index < bytes.Le
24650 6e 67 74 68 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a  ngth; index++)..
24660 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
24670 20 20 20 20 20 20 20 62 75 69 6c 64 65 72 2e 41         builder.A
24680 70 70 65 6e 64 28 68 65 78 44 69 67 69 74 73 5b  ppend(hexDigits[
24690 28 62 79 74 65 73 5b 69 6e 64 65 78 5d 20 26 20  (bytes[index] & 
246a0 30 78 46 30 29 20 3e 3e 20 34 5d 29 3b 0d 0a 20  0xF0) >> 4]);.. 
246b0 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64             build
246c0 65 72 2e 41 70 70 65 6e 64 28 68 65 78 44 69 67  er.Append(hexDig
246d0 69 74 73 5b 62 79 74 65 73 5b 69 6e 64 65 78 5d  its[bytes[index]
246e0 20 26 20 30 78 30 46 5d 29 3b 0d 0a 20 20 20 20   & 0x0F]);..    
246f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24700 20 62 75 69 6c 64 65 72 2e 41 70 70 65 6e 64 28   builder.Append(
24710 22 27 20 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  "' ");..    }...
24720 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
24730 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 65 6c 70  y>..    /// Help
24740 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68  er method for th
24750 65 20 47 72 6f 75 70 20 42 79 20 76 69 73 69 74  e Group By visit
24760 6f 72 0d 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75  or..    /// Retu
24770 72 6e 73 20 74 72 75 65 20 69 66 20 61 74 20 6c  rns true if at l
24780 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
24790 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 74 68  aggregates in th
247a0 65 20 67 69 76 65 6e 20 6c 69 73 74 0d 0a 20 20  e given list..  
247b0 20 20 2f 2f 2f 20 68 61 73 20 61 6e 20 61 72 67    /// has an arg
247c0 75 6d 65 6e 74 20 74 68 61 74 20 69 73 20 6e 6f  ument that is no
247d0 74 20 61 20 3c 73 65 65 20 63 72 65 66 3d 22 44  t a <see cref="D
247e0 62 50 72 6f 70 65 72 74 79 45 78 70 72 65 73 73  bPropertyExpress
247f0 69 6f 6e 22 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20  ion"/>..    /// 
24800 6f 76 65 72 20 3c 73 65 65 20 63 72 65 66 3d 22  over <see cref="
24810 44 62 56 61 72 69 61 62 6c 65 52 65 66 65 72 65  DbVariableRefere
24820 6e 63 65 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e  nceExpression"/>
24830 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
24840 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ary>..    /// <p
24850 61 72 61 6d 20 6e 61 6d 65 3d 22 61 67 67 72 65  aram name="aggre
24860 67 61 74 65 73 22 3e 3c 2f 70 61 72 61 6d 3e 0d  gates"></param>.
24870 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
24880 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  s></returns>..  
24890 20 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 4e 65    static bool Ne
248a0 65 64 73 49 6e 6e 65 72 51 75 65 72 79 28 49 4c  edsInnerQuery(IL
248b0 69 73 74 3c 44 62 41 67 67 72 65 67 61 74 65 3e  ist<DbAggregate>
248c0 20 61 67 67 72 65 67 61 74 65 73 29 0d 0a 20 20   aggregates)..  
248d0 20 20 7b 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    {..      forea
248e0 63 68 20 28 44 62 41 67 67 72 65 67 61 74 65 20  ch (DbAggregate 
248f0 61 67 67 72 65 67 61 74 65 20 69 6e 20 61 67 67  aggregate in agg
24900 72 65 67 61 74 65 73 29 0d 0a 20 20 20 20 20 20  regates)..      
24910 7b 0d 0a 20 20 20 20 20 20 20 20 44 65 62 75 67  {..        Debug
24920 2e 41 73 73 65 72 74 28 61 67 67 72 65 67 61 74  .Assert(aggregat
24930 65 2e 41 72 67 75 6d 65 6e 74 73 2e 43 6f 75 6e  e.Arguments.Coun
24940 74 20 3d 3d 20 31 29 3b 0d 0a 20 20 20 20 20 20  t == 1);..      
24950 20 20 69 66 20 28 21 49 73 50 72 6f 70 65 72 74    if (!IsPropert
24960 79 4f 76 65 72 56 61 72 52 65 66 28 61 67 67 72  yOverVarRef(aggr
24970 65 67 61 74 65 2e 41 72 67 75 6d 65 6e 74 73 5b  egate.Arguments[
24980 30 5d 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  0]))..        {.
24990 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
249a0 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20  n true;..       
249b0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
249c0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
249d0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
249e0 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
249f0 20 20 2f 2f 2f 20 44 65 74 65 72 6d 69 6e 65 73    /// Determines
24a00 20 77 68 65 74 68 65 72 20 74 68 65 20 67 69 76   whether the giv
24a10 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
24a20 20 61 20 3c 73 65 65 20 63 72 65 66 3d 22 44 62   a <see cref="Db
24a30 50 72 6f 70 65 72 74 79 45 78 70 72 65 73 73 69  PropertyExpressi
24a40 6f 6e 22 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 6f  on"/>..    /// o
24a50 76 65 72 20 3c 73 65 65 20 63 72 65 66 3d 22 44  ver <see cref="D
24a60 62 56 61 72 69 61 62 6c 65 52 65 66 65 72 65 6e  bVariableReferen
24a70 63 65 45 78 70 72 65 73 73 69 6f 6e 22 2f 3e 0d  ceExpression"/>.
24a80 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
24a90 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
24aa0 72 61 6d 20 6e 61 6d 65 3d 22 65 78 70 72 65 73  ram name="expres
24ab0 73 69 6f 6e 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a  sion"></param>..
24ac0 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
24ad0 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  ></returns>..   
24ae0 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 49 73 50   static bool IsP
24af0 72 6f 70 65 72 74 79 4f 76 65 72 56 61 72 52 65  ropertyOverVarRe
24b00 66 28 44 62 45 78 70 72 65 73 73 69 6f 6e 20 65  f(DbExpression e
24b10 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20  xpression)..    
24b20 7b 0d 0a 20 20 20 20 20 20 44 62 50 72 6f 70 65  {..      DbPrope
24b30 72 74 79 45 78 70 72 65 73 73 69 6f 6e 20 70 72  rtyExpression pr
24b40 6f 70 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e  opertyExpression
24b50 20 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73   = expression as
24b60 20 44 62 50 72 6f 70 65 72 74 79 45 78 70 72 65   DbPropertyExpre
24b70 73 73 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 69 66  ssion;..      if
24b80 20 28 70 72 6f 70 65 72 74 79 45 78 70 72 65 73   (propertyExpres
24b90 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  sion == null).. 
24ba0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
24bb0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
24bc0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 44 62       }..      Db
24bd0 56 61 72 69 61 62 6c 65 52 65 66 65 72 65 6e 63  VariableReferenc
24be0 65 45 78 70 72 65 73 73 69 6f 6e 20 76 61 72 52  eExpression varR
24bf0 65 66 45 78 70 72 65 73 73 69 6f 6e 20 3d 20 70  efExpression = p
24c00 72 6f 70 65 72 74 79 45 78 70 72 65 73 73 69 6f  ropertyExpressio
24c10 6e 2e 49 6e 73 74 61 6e 63 65 20 61 73 20 44 62  n.Instance as Db
24c20 56 61 72 69 61 62 6c 65 52 65 66 65 72 65 6e 63  VariableReferenc
24c30 65 45 78 70 72 65 73 73 69 6f 6e 3b 0d 0a 20 20  eExpression;..  
24c40 20 20 20 20 69 66 20 28 76 61 72 52 65 66 45 78      if (varRefEx
24c50 70 72 65 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c  pression == null
24c60 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
24c70 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
24c80 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
24c90 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a    return true;..
24ca0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 65 6e      }....    #en
24cb0 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 70  dregion....    p
24cc0 72 69 76 61 74 65 20 63 6c 61 73 73 20 4b 65 79  rivate class Key
24cd0 46 69 65 6c 64 45 78 70 72 65 73 73 69 6f 6e 43  FieldExpressionC
24ce0 6f 6d 70 61 72 65 72 20 3a 20 49 45 71 75 61 6c  omparer : IEqual
24cf0 69 74 79 43 6f 6d 70 61 72 65 72 3c 44 62 45 78  ityComparer<DbEx
24d00 70 72 65 73 73 69 6f 6e 3e 0d 0a 20 20 20 20 7b  pression>..    {
24d10 0d 0a 20 20 20 20 20 20 2f 2f 20 46 69 65 6c 64  ..      // Field
24d20 73 0d 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61  s..      interna
24d30 6c 20 73 74 61 74 69 63 20 72 65 61 64 6f 6e 6c  l static readonl
24d40 79 20 53 71 6c 47 65 6e 65 72 61 74 6f 72 2e 4b  y SqlGenerator.K
24d50 65 79 46 69 65 6c 64 45 78 70 72 65 73 73 69 6f  eyFieldExpressio
24d60 6e 43 6f 6d 70 61 72 65 72 20 53 69 6e 67 6c 65  nComparer Single
24d70 74 6f 6e 20 3d 20 6e 65 77 20 53 71 6c 47 65 6e  ton = new SqlGen
24d80 65 72 61 74 6f 72 2e 4b 65 79 46 69 65 6c 64 45  erator.KeyFieldE
24d90 78 70 72 65 73 73 69 6f 6e 43 6f 6d 70 61 72 65  xpressionCompare
24da0 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f  r();....      //
24db0 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20   Methods..      
24dc0 70 72 69 76 61 74 65 20 4b 65 79 46 69 65 6c 64  private KeyField
24dd0 45 78 70 72 65 73 73 69 6f 6e 43 6f 6d 70 61 72  ExpressionCompar
24de0 65 72 28 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  er()..      {.. 
24df0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24e00 70 75 62 6c 69 63 20 62 6f 6f 6c 20 45 71 75 61  public bool Equa
24e10 6c 73 28 44 62 45 78 70 72 65 73 73 69 6f 6e 20  ls(DbExpression 
24e20 78 2c 20 44 62 45 78 70 72 65 73 73 69 6f 6e 20  x, DbExpression 
24e30 79 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  y)..      {..   
24e40 20 20 20 20 20 69 66 20 28 78 2e 45 78 70 72 65       if (x.Expre
24e50 73 73 69 6f 6e 4b 69 6e 64 20 3d 3d 20 79 2e 45  ssionKind == y.E
24e60 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 29 0d 0a  xpressionKind)..
24e70 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
24e80 20 20 20 20 20 44 62 45 78 70 72 65 73 73 69 6f       DbExpressio
24e90 6e 4b 69 6e 64 20 65 78 70 72 65 73 73 69 6f 6e  nKind expression
24ea0 4b 69 6e 64 20 3d 20 78 2e 45 78 70 72 65 73 73  Kind = x.Express
24eb0 69 6f 6e 4b 69 6e 64 3b 0d 0a 20 20 20 20 20 20  ionKind;..      
24ec0 20 20 20 20 69 66 20 28 65 78 70 72 65 73 73 69      if (expressi
24ed0 6f 6e 4b 69 6e 64 20 3c 3d 20 44 62 45 78 70 72  onKind <= DbExpr
24ee0 65 73 73 69 6f 6e 4b 69 6e 64 2e 50 61 72 61 6d  essionKind.Param
24ef0 65 74 65 72 52 65 66 65 72 65 6e 63 65 29 0d 0a  eterReference)..
24f00 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
24f10 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
24f20 28 65 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 29  (expressionKind)
24f30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
24f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24f50 61 73 65 20 44 62 45 78 70 72 65 73 73 69 6f 6e  ase DbExpression
24f60 4b 69 6e 64 2e 43 61 73 74 3a 0d 0a 20 20 20 20  Kind.Cast:..    
24f70 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f90 20 44 62 43 61 73 74 45 78 70 72 65 73 73 69 6f   DbCastExpressio
24fa0 6e 20 65 78 70 72 65 73 73 69 6f 6e 35 20 3d 20  n expression5 = 
24fb0 28 44 62 43 61 73 74 45 78 70 72 65 73 73 69 6f  (DbCastExpressio
24fc0 6e 29 78 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  n)x;..          
24fd0 20 20 20 20 20 20 20 20 44 62 43 61 73 74 45 78          DbCastEx
24fe0 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
24ff0 69 6f 6e 36 20 3d 20 28 44 62 43 61 73 74 45 78  ion6 = (DbCastEx
25000 70 72 65 73 73 69 6f 6e 29 79 3b 0d 0a 20 20 20  pression)y;..   
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
25020 65 74 75 72 6e 20 28 28 65 78 70 72 65 73 73 69  eturn ((expressi
25030 6f 6e 35 2e 52 65 73 75 6c 74 54 79 70 65 20 3d  on5.ResultType =
25040 3d 20 65 78 70 72 65 73 73 69 6f 6e 36 2e 52 65  = expression6.Re
25050 73 75 6c 74 54 79 70 65 29 20 26 26 20 74 68 69  sultType) && thi
25060 73 2e 45 71 75 61 6c 73 28 65 78 70 72 65 73 73  s.Equals(express
25070 69 6f 6e 35 2e 41 72 67 75 6d 65 6e 74 2c 20 65  ion5.Argument, e
25080 78 70 72 65 73 73 69 6f 6e 36 2e 41 72 67 75 6d  xpression6.Argum
25090 65 6e 74 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  ent));..        
250a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
250b0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 44 62           case Db
250c0 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 50  ExpressionKind.P
250d0 61 72 61 6d 65 74 65 72 52 65 66 65 72 65 6e 63  arameterReferenc
250e0 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e:..            
250f0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
25100 20 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d           DbParam
25110 65 74 65 72 52 65 66 65 72 65 6e 63 65 45 78 70  eterReferenceExp
25120 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69  ression expressi
25130 6f 6e 33 20 3d 20 28 44 62 50 61 72 61 6d 65 74  on3 = (DbParamet
25140 65 72 52 65 66 65 72 65 6e 63 65 45 78 70 72 65  erReferenceExpre
25150 73 73 69 6f 6e 29 78 3b 0d 0a 20 20 20 20 20 20  ssion)x;..      
25160 20 20 20 20 20 20 20 20 20 20 20 20 44 62 50 61              DbPa
25170 72 61 6d 65 74 65 72 52 65 66 65 72 65 6e 63 65  rameterReference
25180 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
25190 73 73 69 6f 6e 34 20 3d 20 28 44 62 50 61 72 61  ssion4 = (DbPara
251a0 6d 65 74 65 72 52 65 66 65 72 65 6e 63 65 45 78  meterReferenceEx
251b0 70 72 65 73 73 69 6f 6e 29 79 3b 0d 0a 20 20 20  pression)y;..   
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
251d0 65 74 75 72 6e 20 28 65 78 70 72 65 73 73 69 6f  eturn (expressio
251e0 6e 33 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65  n3.ParameterName
251f0 20 3d 3d 20 65 78 70 72 65 73 73 69 6f 6e 34 2e   == expression4.
25200 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 29 3b 0d  ParameterName);.
25210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25220 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
25230 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  }..            g
25240 6f 74 6f 20 4c 61 62 65 6c 5f 30 30 43 43 3b 0d  oto Label_00CC;.
25250 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
25260 20 20 20 20 20 20 20 20 69 66 20 28 65 78 70 72          if (expr
25270 65 73 73 69 6f 6e 4b 69 6e 64 20 21 3d 20 44 62  essionKind != Db
25280 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 50  ExpressionKind.P
25290 72 6f 70 65 72 74 79 29 0d 0a 20 20 20 20 20 20  roperty)..      
252a0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
252b0 20 20 20 69 66 20 28 65 78 70 72 65 73 73 69 6f     if (expressio
252c0 6e 4b 69 6e 64 20 3d 3d 20 44 62 45 78 70 72 65  nKind == DbExpre
252d0 73 73 69 6f 6e 4b 69 6e 64 2e 56 61 72 69 61 62  ssionKind.Variab
252e0 6c 65 52 65 66 65 72 65 6e 63 65 29 0d 0a 20 20  leReference)..  
252f0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
25300 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
25310 6e 20 28 78 20 3d 3d 20 79 29 3b 0d 0a 20 20 20  n (x == y);..   
25320 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
25330 20 20 20 20 20 20 20 20 67 6f 74 6f 20 4c 61 62          goto Lab
25340 65 6c 5f 30 30 43 43 3b 0d 0a 20 20 20 20 20 20  el_00CC;..      
25350 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
25360 20 44 62 50 72 6f 70 65 72 74 79 45 78 70 72 65   DbPropertyExpre
25370 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssion expression
25380 20 3d 20 28 44 62 50 72 6f 70 65 72 74 79 45 78   = (DbPropertyEx
25390 70 72 65 73 73 69 6f 6e 29 78 3b 0d 0a 20 20 20  pression)x;..   
253a0 20 20 20 20 20 20 20 44 62 50 72 6f 70 65 72 74         DbPropert
253b0 79 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72  yExpression expr
253c0 65 73 73 69 6f 6e 32 20 3d 20 28 44 62 50 72 6f  ession2 = (DbPro
253d0 70 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e 29  pertyExpression)
253e0 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  y;..          if
253f0 20 28 65 78 70 72 65 73 73 69 6f 6e 2e 50 72 6f   (expression.Pro
25400 70 65 72 74 79 20 3d 3d 20 65 78 70 72 65 73 73  perty == express
25410 69 6f 6e 32 2e 50 72 6f 70 65 72 74 79 29 0d 0a  ion2.Property)..
25420 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
25430 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
25440 74 68 69 73 2e 45 71 75 61 6c 73 28 65 78 70 72  this.Equals(expr
25450 65 73 73 69 6f 6e 2e 49 6e 73 74 61 6e 63 65 2c  ession.Instance,
25460 20 65 78 70 72 65 73 73 69 6f 6e 32 2e 49 6e 73   expression2.Ins
25470 74 61 6e 63 65 29 3b 0d 0a 20 20 20 20 20 20 20  tance);..       
25480 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
25490 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
254a0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 4c 61  false;..      La
254b0 62 65 6c 5f 30 30 43 43 3a 0d 0a 20 20 20 20 20  bel_00CC:..     
254c0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
254d0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
254e0 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20 47 65     public int Ge
254f0 74 48 61 73 68 43 6f 64 65 28 44 62 45 78 70 72  tHashCode(DbExpr
25500 65 73 73 69 6f 6e 20 6f 62 6a 29 0d 0a 20 20 20  ession obj)..   
25510 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 77     {..        sw
25520 69 74 63 68 20 28 6f 62 6a 2e 45 78 70 72 65 73  itch (obj.Expres
25530 73 69 6f 6e 4b 69 6e 64 29 0d 0a 20 20 20 20 20  sionKind)..     
25540 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
25550 63 61 73 65 20 44 62 45 78 70 72 65 73 73 69 6f  case DbExpressio
25560 6e 4b 69 6e 64 2e 43 61 73 74 3a 0d 0a 20 20 20  nKind.Cast:..   
25570 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
25580 74 68 69 73 2e 47 65 74 48 61 73 68 43 6f 64 65  this.GetHashCode
25590 28 28 28 44 62 43 61 73 74 45 78 70 72 65 73 73  (((DbCastExpress
255a0 69 6f 6e 29 6f 62 6a 29 2e 41 72 67 75 6d 65 6e  ion)obj).Argumen
255b0 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t);....         
255c0 20 63 61 73 65 20 44 62 45 78 70 72 65 73 73 69   case DbExpressi
255d0 6f 6e 4b 69 6e 64 2e 50 61 72 61 6d 65 74 65 72  onKind.Parameter
255e0 52 65 66 65 72 65 6e 63 65 3a 0d 0a 20 20 20 20  Reference:..    
255f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
25600 28 28 44 62 50 61 72 61 6d 65 74 65 72 52 65 66  ((DbParameterRef
25610 65 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f 6e  erenceExpression
25620 29 6f 62 6a 29 2e 50 61 72 61 6d 65 74 65 72 4e  )obj).ParameterN
25630 61 6d 65 2e 47 65 74 48 61 73 68 43 6f 64 65 28  ame.GetHashCode(
25640 29 20 5e 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) ^ 0x7fffffff);
25650 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
25660 73 65 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b  se DbExpressionK
25670 69 6e 64 2e 50 72 6f 70 65 72 74 79 3a 0d 0a 20  ind.Property:.. 
25680 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
25690 6e 20 28 28 44 62 50 72 6f 70 65 72 74 79 45 78  n ((DbPropertyEx
256a0 70 72 65 73 73 69 6f 6e 29 6f 62 6a 29 2e 50 72  pression)obj).Pr
256b0 6f 70 65 72 74 79 2e 47 65 74 48 61 73 68 43 6f  operty.GetHashCo
256c0 64 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  de();....       
256d0 20 20 20 63 61 73 65 20 44 62 45 78 70 72 65 73     case DbExpres
256e0 73 69 6f 6e 4b 69 6e 64 2e 56 61 72 69 61 62 6c  sionKind.Variabl
256f0 65 52 65 66 65 72 65 6e 63 65 3a 0d 0a 20 20 20  eReference:..   
25700 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
25710 28 28 44 62 56 61 72 69 61 62 6c 65 52 65 66 65  ((DbVariableRefe
25720 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f 6e 29  renceExpression)
25730 6f 62 6a 29 2e 56 61 72 69 61 62 6c 65 4e 61 6d  obj).VariableNam
25740 65 2e 47 65 74 48 61 73 68 43 6f 64 65 28 29 3b  e.GetHashCode();
25750 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
25760 20 20 20 20 20 72 65 74 75 72 6e 20 6f 62 6a 2e       return obj.
25770 47 65 74 48 61 73 68 43 6f 64 65 28 29 3b 0d 0a  GetHashCode();..
25780 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
25790 20 20 7d 0d 0a 7d 0d 0a 0d 0a                      }..}....