Skip to content

Commit 3aa8bd0

Browse files
committed
NH-3609 - Fixed issue where Avg with Conditional inside would generate invalid sql.
1 parent e614d98 commit 3aa8bd0

File tree

2 files changed

+33
-11
lines changed

2 files changed

+33
-11
lines changed

src/NHibernate.Test/NHSpecificTest/NH3609/Fixture.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,28 @@ protected override void OnTearDown()
3535
}
3636
}
3737

38+
[Test]
39+
public void AvgWithConditionalDoesNotThrow()
40+
{
41+
using (var session = OpenSession())
42+
using (session.BeginTransaction())
43+
{
44+
MappingEntity mappingEntity = null;
45+
Assert.DoesNotThrow(
46+
() =>
47+
session.QueryOver<Entity>().SelectList(
48+
builder =>
49+
builder.Select(
50+
Projections.Avg(
51+
Projections.Conditional(
52+
Restrictions.Eq(Projections.Property<Entity>(x => x.Name), "FOO"),
53+
Projections.Constant("", NHibernateUtil.String),
54+
Projections.Constant(null, NHibernateUtil.String))).WithAlias(() => mappingEntity.Count))
55+
).TransformUsing(Transformers.AliasToBean<MappingEntity>()).List<MappingEntity>()
56+
);
57+
}
58+
}
59+
3860
[Test]
3961
public void CountWithConditionalDoesNotThrow()
4062
{

src/NHibernate/Criterion/AvgProjection.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,32 @@ namespace NHibernate.Criterion
1212
public class AvgProjection : AggregateProjection
1313
{
1414
public AvgProjection(IProjection projection) : base("avg", projection) {}
15-
public AvgProjection(String propertyName) : base("avg", propertyName) {}
15+
public AvgProjection(string propertyName) : base("avg", propertyName) {}
1616

17-
public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery,
18-
IDictionary<string, IFilter> enabledFilters)
17+
public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
1918
{
2019
ISessionFactoryImplementor factory = criteriaQuery.Factory;
2120
SqlType[] sqlTypeCodes = NHibernateUtil.Double.SqlTypes(factory);
2221
string sqlType = factory.Dialect.GetCastTypeName(sqlTypeCodes[0]);
23-
string parameter;
22+
23+
var sql = new SqlStringBuilder().Add(aggregate).Add("(");
24+
sql.Add("cast(");
2425
if (projection != null)
2526
{
26-
parameter =
27-
SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery, enabledFilters)).ToString();
27+
sql.Add(SqlStringHelper.RemoveAsAliasesFromSql(projection.ToSqlString(criteria, loc, criteriaQuery, enabledFilters)));
2828
}
2929
else
3030
{
31-
parameter = criteriaQuery.GetColumn(criteria, propertyName);
31+
sql.Add(criteriaQuery.GetColumn(criteria, propertyName));
3232
}
33-
string expression = string.Format("{0}(cast({1} as {2})) as {3}", aggregate, parameter, sqlType,
34-
GetColumnAliases(loc, criteria, criteriaQuery)[0]);
35-
return new SqlString(expression);
33+
sql.Add(" as ").Add(sqlType).Add(")");
34+
sql.Add(") as ").Add(GetColumnAliases(loc, criteria, criteriaQuery)[0]);
35+
return sql.ToSqlString();
3636
}
3737

3838
public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery)
3939
{
4040
return new IType[] {NHibernateUtil.Double};
4141
}
4242
}
43-
}
43+
}

0 commit comments

Comments
 (0)