in asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericDivideTypeComputer.java [40:131]
protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
IAType t1 = strippedInputTypes[0];
IAType t2 = strippedInputTypes[1];
ATypeTag tag1 = t1.getTypeTag();
ATypeTag tag2 = t2.getTypeTag();
IAType type;
switch (tag1) {
case DOUBLE:
switch (tag2) {
case TINYINT:
case SMALLINT:
case INTEGER:
case BIGINT:
case FLOAT:
case DOUBLE:
type = BuiltinType.ADOUBLE;
break;
case ANY:
type = BuiltinType.ANY;
break;
default:
return BuiltinType.ANULL;
}
break;
case FLOAT:
switch (tag2) {
case TINYINT:
case SMALLINT:
case INTEGER:
case BIGINT:
case FLOAT:
type = BuiltinType.AFLOAT;
break;
case DOUBLE:
type = BuiltinType.ADOUBLE;
break;
case ANY:
type = BuiltinType.ANY;
break;
default:
return BuiltinType.ANULL;
}
break;
case BIGINT:
case INTEGER:
case SMALLINT:
case TINYINT:
switch (tag2) {
case TINYINT:
case SMALLINT:
case INTEGER:
case BIGINT:
case DOUBLE:
type = BuiltinType.ADOUBLE;
break;
case FLOAT:
type = BuiltinType.AFLOAT;
break;
case ANY:
type = BuiltinType.ANY;
break;
default:
return BuiltinType.ANULL;
}
break;
case ANY:
switch (tag2) {
case TINYINT:
case SMALLINT:
case INTEGER:
case BIGINT:
case FLOAT:
case ANY:
case DOUBLE:
type = BuiltinType.ANY;
break;
default:
return BuiltinType.ANULL;
}
break;
default:
return BuiltinType.ANULL;
}
if (type.getTypeTag() != ATypeTag.ANY) {
// returns NULL if division by 0
type = AUnionType.createNullableType(type);
}
return type;
}