@@ -18,6 +18,8 @@ internal abstract class ColumnMappingInspector : CompilableProviderVisitor
1818 private readonly CompilableProviderVisitor outerColumnUsageVisitor ;
1919 private readonly CompilableProvider rootProvider ;
2020
21+ private bool hasGrouping ;
22+
2123 public virtual CompilableProvider RemoveRedundantColumns ( )
2224 {
2325 mappings . Add ( rootProvider , Enumerable . Range ( 0 , rootProvider . Header . Length ) . ToList ( ) ) ;
@@ -224,7 +226,13 @@ protected override Provider VisitAggregate(AggregateProvider provider)
224226 . Select ( c => c . SourceIndex )
225227 . Union ( provider . GroupColumnIndexes ) ;
226228 mappings [ provider . Source ] = Merge ( mappings [ provider ] , map ) ;
229+
230+ if ( provider . GroupColumnIndexes . Length > 0 ) {
231+ hasGrouping = true ;
232+ }
233+
227234 var source = VisitCompilable ( provider . Source ) ;
235+ hasGrouping = false ;
228236
229237 var sourceMap = mappings [ provider . Source ] ;
230238 var currentMap = mappings [ provider ] ;
@@ -292,6 +300,28 @@ protected override Provider VisitRowNumber(RowNumberProvider provider)
292300 return new RowNumberProvider ( newSource , rowNumberColumn . Name ) ;
293301 }
294302
303+ protected override Provider VisitStore ( StoreProvider provider )
304+ {
305+ var compilableSource = provider . Source as CompilableProvider ;
306+ if ( compilableSource == null )
307+ return provider ;
308+
309+ if ( hasGrouping ) {
310+ mappings . Add ( provider . Sources [ 0 ] ,
311+ Merge ( mappings [ provider ] , provider . Header . Columns . Select ( ( c , i ) => i ) ) ) ;
312+ }
313+ else {
314+ OnRecursionEntrance ( provider ) ;
315+ }
316+
317+ var source = VisitCompilable ( compilableSource ) ;
318+
319+ _ = OnRecursionExit ( provider ) ;
320+ if ( source == compilableSource )
321+ return provider ;
322+ return new StoreProvider ( source , provider . Name ) ;
323+ }
324+
295325 protected override Provider VisitConcat ( ConcatProvider provider )
296326 {
297327 return VisitSetOperationProvider ( provider ) ;
0 commit comments