Skip to content

Commit 9871ce7

Browse files
committed
Fixes
1 parent 4a63f7f commit 9871ce7

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/NHibernate/Hql/Ast/ANTLR/Tree/CaseNode.cs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,38 @@ public override IType DataType
2929
if (ExpectedType != null)
3030
return ExpectedType;
3131

32-
foreach (var node in GetResultNodes())
32+
if (base.DataType != null)
33+
return base.DataType;
34+
35+
var dataType = GetTypeFromResultNodes();
36+
37+
foreach (var node in GetResultNodes().OfType<ISelectExpression>())
3338
{
34-
if (node is ISelectExpression select && !(node is ParameterNode))
35-
return select.DataType;
39+
if (node.DataType == null && node is IExpectedTypeAwareNode typeAwareNode)
40+
{
41+
typeAwareNode.ExpectedType = dataType;
42+
}
3643
}
3744

38-
throw new HibernateException("Unable to determine data type of CASE statement.");
45+
base.DataType = dataType;
46+
return dataType;
3947
}
4048
set { base.DataType = value; }
4149
}
4250

51+
private IType GetTypeFromResultNodes()
52+
{
53+
foreach (var node in GetResultNodes())
54+
{
55+
if (node is ISelectExpression select && select.DataType != null)
56+
{
57+
return select.DataType;
58+
}
59+
}
60+
61+
throw new HibernateException("Unable to determine data type of CASE statement.");
62+
}
63+
4364
public IEnumerable<IASTNode> GetResultNodes()
4465
{
4566
for (int i = 0; i < ChildCount; i++)

src/NHibernate/Linq/Functions/StringGenerator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,8 @@ public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject,
217217
{
218218
var expression = visitor.Visit(targetObject).AsExpression();
219219
var index = treeBuilder.Add(visitor.Visit(arguments[0]).AsExpression(), treeBuilder.Constant(1));
220-
return treeBuilder.MethodCall("substring", expression, index, treeBuilder.Constant(1));
220+
221+
return treeBuilder.TransparentCast(treeBuilder.MethodCall("substring", expression, index, treeBuilder.Constant(1)), typeof(char));
221222
}
222223
}
223224

0 commit comments

Comments
 (0)