morrySnow commented on code in PR #44732: URL: https://github.com/apache/doris/pull/44732#discussion_r1862342822
########## fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java: ########## @@ -1796,6 +1797,65 @@ private static Expression processDecimalV3BinaryArithmetic(BinaryArithmetic bina castIfNotSameType(right, dt2)); } + /** + * get min and max value of a data type + * + * @param dataType specific data type + * @return min and max values pair + */ + public static Optional<Pair<BigDecimal, BigDecimal>> getDataTypeMinMaxValue(DataType dataType) { + if (dataType.isTinyIntType()) { + return Optional.of(Pair.of(new BigDecimal(Byte.MIN_VALUE), new BigDecimal(Byte.MAX_VALUE))); + } else if (dataType.isSmallIntType()) { + return Optional.of(Pair.of(new BigDecimal(Short.MIN_VALUE), new BigDecimal(Short.MAX_VALUE))); + } else if (dataType.isIntegerType()) { + return Optional.of(Pair.of(new BigDecimal(Integer.MIN_VALUE), new BigDecimal(Integer.MAX_VALUE))); + } else if (dataType.isBigIntType()) { + return Optional.of(Pair.of(new BigDecimal(Long.MIN_VALUE), new BigDecimal(Long.MAX_VALUE))); + } else if (dataType.isLargeIntType()) { + return Optional.of(Pair.of(new BigDecimal(LargeIntType.MIN_VALUE), new BigDecimal(LargeIntType.MAX_VALUE))); + } else if (dataType.isFloatType()) { + //minVal = BigDecimal.valueOf(-Float.MAX_VALUE); + return Optional.of(Pair.of(new BigDecimal(String.valueOf(Float.MIN_VALUE)), + new BigDecimal(String.valueOf(Float.MAX_VALUE)))); + } else if (dataType.isDoubleType()) { + //minVal = BigDecimal.valueOf(-Double.MAX_VALUE); + return Optional.of(Pair.of(new BigDecimal(String.valueOf(Double.MIN_VALUE)), + new BigDecimal(String.valueOf(Double.MAX_VALUE)))); + } else if (dataType.isDecimalLikeType()) { + int precision = -1; + int scale = -1; + if (dataType instanceof DecimalV2Type) { + DecimalV2Type type = (DecimalV2Type) dataType; + precision = type.getPrecision(); + scale = type.getScale(); + } + if (dataType instanceof DecimalV3Type) { + DecimalV3Type type = (DecimalV3Type) dataType; + precision = type.getPrecision(); + scale = type.getScale(); + } + if (scale >= 0) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < precision - scale; i++) { + sb.append('9'); Review Comment: maybe u could use `org.apache.common.lang3.StringUtils.repeat` ########## fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java: ########## @@ -207,6 +207,22 @@ public static Expression or(Collection<Expression> expressions) { return combineAsLeftDeepTree(Or.class, expressions); } + public static Expression getFalse(Expression expression) { + if (expression.nullable()) { + return new And(new IsNull(expression), new NullLiteral(BooleanType.INSTANCE)); + } else { + return BooleanLiteral.FALSE; + } + } + + public static Expression getTrue(Expression expression) { Review Comment: maybe trueOrNull is a better name? ########## fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java: ########## @@ -1796,6 +1797,65 @@ private static Expression processDecimalV3BinaryArithmetic(BinaryArithmetic bina castIfNotSameType(right, dt2)); } + /** + * get min and max value of a data type + * + * @param dataType specific data type + * @return min and max values pair + */ + public static Optional<Pair<BigDecimal, BigDecimal>> getDataTypeMinMaxValue(DataType dataType) { + if (dataType.isTinyIntType()) { + return Optional.of(Pair.of(new BigDecimal(Byte.MIN_VALUE), new BigDecimal(Byte.MAX_VALUE))); + } else if (dataType.isSmallIntType()) { + return Optional.of(Pair.of(new BigDecimal(Short.MIN_VALUE), new BigDecimal(Short.MAX_VALUE))); + } else if (dataType.isIntegerType()) { + return Optional.of(Pair.of(new BigDecimal(Integer.MIN_VALUE), new BigDecimal(Integer.MAX_VALUE))); + } else if (dataType.isBigIntType()) { + return Optional.of(Pair.of(new BigDecimal(Long.MIN_VALUE), new BigDecimal(Long.MAX_VALUE))); + } else if (dataType.isLargeIntType()) { + return Optional.of(Pair.of(new BigDecimal(LargeIntType.MIN_VALUE), new BigDecimal(LargeIntType.MAX_VALUE))); + } else if (dataType.isFloatType()) { + //minVal = BigDecimal.valueOf(-Float.MAX_VALUE); + return Optional.of(Pair.of(new BigDecimal(String.valueOf(Float.MIN_VALUE)), + new BigDecimal(String.valueOf(Float.MAX_VALUE)))); + } else if (dataType.isDoubleType()) { + //minVal = BigDecimal.valueOf(-Double.MAX_VALUE); Review Comment: need `-Double.MAX_VALUE` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org