@@ -57,6 +57,35 @@ protected SqlResult PrepareResult(SqlResult ctx)
5757 return ctx ;
5858 }
5959
60+ private Query TransformAggregateQuery ( Query query )
61+ {
62+ var clause = query . GetOneComponent < AggregateClause > ( "aggregate" , EngineCode ) ;
63+ if ( clause . Columns . Count == 1 && ! query . IsDistinct ) return query ;
64+
65+ if ( query . IsDistinct )
66+ {
67+ query . ClearComponent ( "aggregate" , EngineCode ) ;
68+ query . Select ( clause . Columns . ToArray ( ) ) ;
69+ }
70+ else
71+ {
72+ foreach ( var column in clause . Columns )
73+ {
74+ query . WhereNotNull ( column ) ;
75+ }
76+ }
77+
78+ var outerClause = new AggregateClause ( )
79+ {
80+ Columns = new List < string > { "*" } ,
81+ Type = clause . Type
82+ } ;
83+
84+ return new Query ( )
85+ . AddComponent ( "aggregate" , outerClause )
86+ . From ( query , $ "{ clause . Type } Query") ;
87+ }
88+
6089 protected virtual SqlResult CompileRaw ( Query query )
6190 {
6291 SqlResult ctx ;
@@ -80,6 +109,8 @@ protected virtual SqlResult CompileRaw(Query query)
80109 query . ClearComponent ( "limit" )
81110 . ClearComponent ( "order" )
82111 . ClearComponent ( "group" ) ;
112+
113+ query = TransformAggregateQuery ( query ) ;
83114 }
84115
85116 ctx = CompileSelectQuery ( query ) ;
@@ -395,7 +426,6 @@ protected virtual SqlResult OnBeforeSelect(SqlResult ctx)
395426
396427 protected virtual string CompileColumns ( SqlResult ctx )
397428 {
398-
399429 if ( ctx . Query . HasComponent ( "aggregate" , EngineCode ) )
400430 {
401431 var aggregate = ctx . Query . GetOneComponent < AggregateClause > ( "aggregate" , EngineCode ) ;
@@ -404,14 +434,21 @@ protected virtual string CompileColumns(SqlResult ctx)
404434 . Select ( x => CompileColumn ( ctx , new Column { Name = x } ) )
405435 . ToList ( ) ;
406436
407- var sql = string . Join ( ", " , aggregateColumns ) ;
437+ string sql = string . Empty ;
408438
409- if ( ctx . Query . IsDistinct )
439+ if ( aggregateColumns . Count == 1 )
410440 {
411- sql = "DISTINCT " + sql ;
441+ sql = string . Join ( ", " , aggregateColumns ) ;
442+
443+ if ( ctx . Query . IsDistinct )
444+ {
445+ sql = "DISTINCT " + sql ;
446+ }
447+
448+ return "SELECT " + aggregate . Type . ToUpper ( ) + "(" + sql + $ ") { ColumnAsKeyword } " + WrapValue ( aggregate . Type ) ;
412449 }
413450
414- return "SELECT " + aggregate . Type . ToUpper ( ) + "(" + sql + $ ") { ColumnAsKeyword } " + WrapValue ( aggregate . Type ) ;
451+ return "SELECT 1" ;
415452 }
416453
417454 var columns = ctx . Query
0 commit comments