fn test_type_coercion_compare()

in datafusion/expr-common/src/type_coercion/binary.rs [2188:2442]


    fn test_type_coercion_compare() -> Result<()> {
        // boolean
        test_coercion_binary_rule!(
            DataType::Boolean,
            DataType::Boolean,
            Operator::Eq,
            DataType::Boolean
        );
        // float
        test_coercion_binary_rule!(
            DataType::Float32,
            DataType::Int64,
            Operator::Eq,
            DataType::Float32
        );
        test_coercion_binary_rule!(
            DataType::Float32,
            DataType::Float64,
            Operator::GtEq,
            DataType::Float64
        );
        // signed integer
        test_coercion_binary_rule!(
            DataType::Int8,
            DataType::Int32,
            Operator::LtEq,
            DataType::Int32
        );
        test_coercion_binary_rule!(
            DataType::Int64,
            DataType::Int32,
            Operator::LtEq,
            DataType::Int64
        );
        // unsigned integer
        test_coercion_binary_rule!(
            DataType::UInt32,
            DataType::UInt8,
            Operator::Gt,
            DataType::UInt32
        );
        test_coercion_binary_rule!(
            DataType::UInt64,
            DataType::UInt8,
            Operator::Eq,
            DataType::UInt64
        );
        test_coercion_binary_rule!(
            DataType::UInt64,
            DataType::Int64,
            Operator::Eq,
            DataType::Decimal128(20, 0)
        );
        // numeric/decimal
        test_coercion_binary_rule!(
            DataType::Int64,
            DataType::Decimal128(10, 0),
            Operator::Eq,
            DataType::Decimal128(20, 0)
        );
        test_coercion_binary_rule!(
            DataType::Int64,
            DataType::Decimal128(10, 2),
            Operator::Lt,
            DataType::Decimal128(22, 2)
        );
        test_coercion_binary_rule!(
            DataType::Float64,
            DataType::Decimal128(10, 3),
            Operator::Gt,
            DataType::Decimal128(30, 15)
        );
        test_coercion_binary_rule!(
            DataType::Int64,
            DataType::Decimal128(10, 0),
            Operator::Eq,
            DataType::Decimal128(20, 0)
        );
        test_coercion_binary_rule!(
            DataType::Decimal128(14, 2),
            DataType::Decimal128(10, 3),
            Operator::GtEq,
            DataType::Decimal128(15, 3)
        );
        test_coercion_binary_rule!(
            DataType::UInt64,
            DataType::Decimal128(20, 0),
            Operator::Eq,
            DataType::Decimal128(20, 0)
        );

        // Binary
        test_coercion_binary_rule!(
            DataType::Binary,
            DataType::Binary,
            Operator::Eq,
            DataType::Binary
        );
        test_coercion_binary_rule!(
            DataType::Utf8,
            DataType::Binary,
            Operator::Eq,
            DataType::Binary
        );
        test_coercion_binary_rule!(
            DataType::Binary,
            DataType::Utf8,
            Operator::Eq,
            DataType::Binary
        );

        // LargeBinary
        test_coercion_binary_rule!(
            DataType::LargeBinary,
            DataType::LargeBinary,
            Operator::Eq,
            DataType::LargeBinary
        );
        test_coercion_binary_rule!(
            DataType::Binary,
            DataType::LargeBinary,
            Operator::Eq,
            DataType::LargeBinary
        );
        test_coercion_binary_rule!(
            DataType::LargeBinary,
            DataType::Binary,
            Operator::Eq,
            DataType::LargeBinary
        );
        test_coercion_binary_rule!(
            DataType::Utf8,
            DataType::LargeBinary,
            Operator::Eq,
            DataType::LargeBinary
        );
        test_coercion_binary_rule!(
            DataType::LargeBinary,
            DataType::Utf8,
            Operator::Eq,
            DataType::LargeBinary
        );
        test_coercion_binary_rule!(
            DataType::LargeUtf8,
            DataType::LargeBinary,
            Operator::Eq,
            DataType::LargeBinary
        );
        test_coercion_binary_rule!(
            DataType::LargeBinary,
            DataType::LargeUtf8,
            Operator::Eq,
            DataType::LargeBinary
        );

        // Timestamps
        let utc: Option<Arc<str>> = Some("UTC".into());
        test_coercion_binary_rule!(
            DataType::Timestamp(TimeUnit::Second, utc.clone()),
            DataType::Timestamp(TimeUnit::Second, utc.clone()),
            Operator::Eq,
            DataType::Timestamp(TimeUnit::Second, utc.clone())
        );
        test_coercion_binary_rule!(
            DataType::Timestamp(TimeUnit::Second, utc.clone()),
            DataType::Timestamp(TimeUnit::Second, Some("Europe/Brussels".into())),
            Operator::Eq,
            DataType::Timestamp(TimeUnit::Second, utc.clone())
        );
        test_coercion_binary_rule!(
            DataType::Timestamp(TimeUnit::Second, Some("America/New_York".into())),
            DataType::Timestamp(TimeUnit::Second, Some("Europe/Brussels".into())),
            Operator::Eq,
            DataType::Timestamp(TimeUnit::Second, Some("America/New_York".into()))
        );
        test_coercion_binary_rule!(
            DataType::Timestamp(TimeUnit::Second, Some("Europe/Brussels".into())),
            DataType::Timestamp(TimeUnit::Second, utc),
            Operator::Eq,
            DataType::Timestamp(TimeUnit::Second, Some("Europe/Brussels".into()))
        );

        // list
        let inner_field = Arc::new(Field::new_list_field(DataType::Int64, true));
        test_coercion_binary_rule!(
            DataType::List(Arc::clone(&inner_field)),
            DataType::List(Arc::clone(&inner_field)),
            Operator::Eq,
            DataType::List(Arc::clone(&inner_field))
        );
        test_coercion_binary_rule!(
            DataType::List(Arc::clone(&inner_field)),
            DataType::LargeList(Arc::clone(&inner_field)),
            Operator::Eq,
            DataType::LargeList(Arc::clone(&inner_field))
        );
        test_coercion_binary_rule!(
            DataType::LargeList(Arc::clone(&inner_field)),
            DataType::List(Arc::clone(&inner_field)),
            Operator::Eq,
            DataType::LargeList(Arc::clone(&inner_field))
        );
        test_coercion_binary_rule!(
            DataType::LargeList(Arc::clone(&inner_field)),
            DataType::LargeList(Arc::clone(&inner_field)),
            Operator::Eq,
            DataType::LargeList(Arc::clone(&inner_field))
        );
        test_coercion_binary_rule!(
            DataType::FixedSizeList(Arc::clone(&inner_field), 10),
            DataType::FixedSizeList(Arc::clone(&inner_field), 10),
            Operator::Eq,
            DataType::FixedSizeList(Arc::clone(&inner_field), 10)
        );
        test_coercion_binary_rule!(
            DataType::FixedSizeList(Arc::clone(&inner_field), 10),
            DataType::LargeList(Arc::clone(&inner_field)),
            Operator::Eq,
            DataType::LargeList(Arc::clone(&inner_field))
        );
        test_coercion_binary_rule!(
            DataType::LargeList(Arc::clone(&inner_field)),
            DataType::FixedSizeList(Arc::clone(&inner_field), 10),
            Operator::Eq,
            DataType::LargeList(Arc::clone(&inner_field))
        );
        test_coercion_binary_rule!(
            DataType::List(Arc::clone(&inner_field)),
            DataType::FixedSizeList(Arc::clone(&inner_field), 10),
            Operator::Eq,
            DataType::List(Arc::clone(&inner_field))
        );
        test_coercion_binary_rule!(
            DataType::FixedSizeList(Arc::clone(&inner_field), 10),
            DataType::List(Arc::clone(&inner_field)),
            Operator::Eq,
            DataType::List(Arc::clone(&inner_field))
        );

        // Negative test: inner_timestamp_field and inner_field are not compatible because their inner types are not compatible
        let inner_timestamp_field = Arc::new(Field::new_list_field(
            DataType::Timestamp(TimeUnit::Microsecond, None),
            true,
        ));
        let result_type = BinaryTypeCoercer::new(
            &DataType::List(Arc::clone(&inner_field)),
            &Operator::Eq,
            &DataType::List(Arc::clone(&inner_timestamp_field)),
        )
        .get_input_types();
        assert!(result_type.is_err());

        // TODO add other data type
        Ok(())
    }