/**
* For CASE WHEN and its special cases section 9.3 of the SQL standard
* on type aggregation is implemented.
*/
void resolveTypesForCaseWhen(Session session) {
if (dataType != null) {
return;
}
Expression expr = this;
while (expr.opType == OpTypes.CASEWHEN) {
expr.nodes[LEFT].resolveTypes(session, expr);
if (expr.nodes[LEFT].isUnresolvedParam()) {
expr.nodes[LEFT].dataType = Type.SQL_BOOLEAN;
}
expr.nodes[RIGHT].nodes[LEFT].resolveTypes(session,
expr.nodes[RIGHT]);
if (expr.nodes[RIGHT].nodes[RIGHT].opType != OpTypes.CASEWHEN) {
expr.nodes[RIGHT].nodes[RIGHT].resolveTypes(session,
expr.nodes[RIGHT]);
}
expr = expr.nodes[RIGHT].nodes[RIGHT];
}
if (exprSubType == OpTypes.CAST) {
if (nodes[RIGHT].nodes[RIGHT].dataType != null
&& nodes[RIGHT].nodes[RIGHT].dataType
!= nodes[RIGHT].nodes[LEFT].dataType) {
Type castType = nodes[RIGHT].nodes[RIGHT].dataType;
if (castType.isCharacterType()) {
castType = Type.SQL_VARCHAR_DEFAULT;
}
nodes[RIGHT].nodes[LEFT] =
new ExpressionOp(nodes[RIGHT].nodes[LEFT], castType);
}
}
expr = this;
while (expr.opType == OpTypes.CASEWHEN) {
dataType =
Type.getAggregateType(expr.nodes[RIGHT].nodes[LEFT].dataType,
dataType);
dataType =
Type.getAggregateType(expr.nodes[RIGHT].nodes[RIGHT].dataType,
dataType);
expr = expr.nodes[RIGHT].nodes[RIGHT];
}
expr = this;
while (expr.opType == OpTypes.CASEWHEN) {
if (expr.nodes[RIGHT].nodes[LEFT].dataType == null) {
expr.nodes[RIGHT].nodes[LEFT].dataType = dataType;
}
if (expr.nodes[RIGHT].nodes[RIGHT].dataType == null) {
expr.nodes[RIGHT].nodes[RIGHT].dataType = dataType;
}
if (expr.nodes[RIGHT].dataType == null) {
expr.nodes[RIGHT].dataType = dataType;
}
expr = expr.nodes[RIGHT].nodes[RIGHT];
}
if (dataType == null || dataType.typeCode == Types.SQL_ALL_TYPES) {
throw Error.error(ErrorCode.X_42567);
}
}