in src/org/apache/pig/newplan/logical/visitor/TypeCheckingExpVisitor.java [346:421]
private void addCastsToCompareBinaryExp(BinaryExpression binOp, boolean isEquality)
throws FrontendException {
LogicalExpression lhs = binOp.getLhs() ;
LogicalExpression rhs = binOp.getRhs() ;
byte lhsType = lhs.getType() ;
byte rhsType = rhs.getType() ;
if ( DataType.isNumberType(lhsType) &&
DataType.isNumberType(rhsType) ) {
// If not the same type, we cast them to the same
byte biggerType = lhsType > rhsType ? lhsType:rhsType ;
// Cast smaller type to the bigger type
if (lhsType != biggerType) {
insertCast(binOp, biggerType, binOp.getLhs());
}
else if (rhsType != biggerType) {
insertCast(binOp, biggerType, binOp.getRhs());
}
}
else if ( (lhsType == DataType.DATETIME) &&
(rhsType == DataType.DATETIME) ) {
// good
}
else if ( (lhsType == DataType.CHARARRAY) &&
(rhsType == DataType.CHARARRAY) ) {
// good
}
else if ( (lhsType == DataType.BYTEARRAY) &&
(rhsType == DataType.BYTEARRAY) ) {
// good
}
else if ( (lhsType == DataType.BYTEARRAY) &&
( (rhsType == DataType.CHARARRAY) || (DataType.isNumberType(rhsType)) || (rhsType == DataType.BOOLEAN) || (rhsType == DataType.DATETIME))
) {
// Cast byte array to the type on rhs
insertCast(binOp, rhsType, binOp.getLhs());
}
else if ( (rhsType == DataType.BYTEARRAY) &&
( (lhsType == DataType.CHARARRAY) || (DataType.isNumberType(lhsType)) || (lhsType == DataType.BOOLEAN) || (lhsType == DataType.DATETIME))
) {
// Cast byte array to the type on lhs
insertCast(binOp, lhsType, binOp.getRhs());
}else if (isEquality){
//in case of equality condition, allow boolean, tuples and maps as args
if((lhsType == DataType.BOOLEAN) &&
(rhsType == DataType.BOOLEAN) ) {
// good
}
else if((lhsType == DataType.TUPLE) &&
(rhsType == DataType.TUPLE) ) {
// good
}
else if ( (lhsType == DataType.MAP) &&
(rhsType == DataType.MAP) ) {
// good
}
else if (lhsType == DataType.BYTEARRAY &&
(rhsType == DataType.MAP || rhsType == DataType.TUPLE)){
// Cast byte array to the type on lhs
insertCast(binOp, rhsType, binOp.getLhs());
}
else if(rhsType == DataType.BYTEARRAY &&
(lhsType == DataType.MAP || lhsType == DataType.TUPLE)){
// Cast byte array to the type on lhs
insertCast(binOp, lhsType, binOp.getRhs());
}
else {
throwIncompatibleTypeError(binOp);
}
}
else {
throwIncompatibleTypeError(binOp);
}
}