[
https://issues.apache.org/jira/browse/CALCITE-5343?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17623471#comment-17623471
]
Mihai Budiu edited comment on CALCITE-5343 at 10/25/22 12:27 AM:
-----------------------------------------------------------------
How about this more hopefully more principled patch below?
I do not really know the Calcite codebase, can someone help me figure out where
an appropriate semantic test should be?
--- a/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java
@@ -22,6 +22,7 @@
import org.apache.calcite.config.NullCollation;
import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeSystem;
import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
import org.apache.calcite.sql.SqlAlienSystemTypeNameSpec;
@@ -44,16 +45,14 @@
import org.apache.calcite.sql.fun.SqlLibraryOperators;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.parser.SqlParserPos;
-import org.apache.calcite.sql.type.InferTypes;
-import org.apache.calcite.sql.type.OperandTypes;
-import org.apache.calcite.sql.type.ReturnTypes;
-import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.sql.type.*;
import com.google.common.collect.ImmutableList;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.List;
+import java.util.Objects;
/**
* A <code>SqlDialect</code> implementation for the MySQL database.
@@ -75,6 +74,15 @@
return super.getMaxPrecision(typeName);
}
}
+
+ @Override public RelDataType
deriveDecimalDivideType(RelDataTypeFactory typeFactory,
+ RelDataType type1, RelDataType type2)
+ RelDataType result = super.deriveDecimalDivideType(typeFactory,
type1, type2); + Objects.requireNonNull(result); + if
(SqlTypeUtil.isExactNumeric(result) || SqlTypeUtil.isDecimal(result)) +
result = typeFactory.createTypeWithNullability(result, true); +
return result; + }
};
public static final SqlDialect.Context DEFAULT_CONTEXT =
SqlDialect.EMPTY_CONTEXT
was (Author: JIRAUSER295926):
How about this more hopefully more principled patch below?
I do not really know the Calcite codebase, can someone help me figure out where
an appropriate semantic test should be?
{{--- a/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java
@@ -22,6 +22,7 @@
import org.apache.calcite.config.NullCollation;
import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeSystem;
import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
import org.apache.calcite.sql.SqlAlienSystemTypeNameSpec;
@@ -44,16 +45,14 @@
import org.apache.calcite.sql.fun.SqlLibraryOperators;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.parser.SqlParserPos;
-import org.apache.calcite.sql.type.InferTypes;
-import org.apache.calcite.sql.type.OperandTypes;
-import org.apache.calcite.sql.type.ReturnTypes;
-import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.sql.type.*;
import com.google.common.collect.ImmutableList;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.List;
+import java.util.Objects;
/**
* A <code>SqlDialect</code> implementation for the MySQL database.
@@ -75,6 +74,15 @@
return super.getMaxPrecision(typeName);
}
}
+
+ @Override public RelDataType
deriveDecimalDivideType(RelDataTypeFactory typeFactory,
+ RelDataType type1, RelDataType type2) {
+ RelDataType result = super.deriveDecimalDivideType(typeFactory,
type1, type2);
+ Objects.requireNonNull(result);
+ if (SqlTypeUtil.isExactNumeric(result) ||
SqlTypeUtil.isDecimal(result))
+ result = typeFactory.createTypeWithNullability(result, true);
+ return result;
+ }
};
public static final SqlDialect.Context DEFAULT_CONTEXT =
SqlDialect.EMPTY_CONTEXT
}}
> Type of division operator
> -------------------------
>
> Key: CALCITE-5343
> URL: https://issues.apache.org/jira/browse/CALCITE-5343
> Project: Calcite
> Issue Type: Bug
> Components: core
> Reporter: Mihai Budiu
> Priority: Minor
>
> The Calcite type checker assigns a type of INTEGER (not nullable) to the
> DIVIDE RexCall in the following statement: `SELECT 1/0`. Some databases, such
> as MySQL, evaluate this expression to NULL.
> This result is obtained even when using SqlConformanceEnum.MYSQL_5 for the
> parser and the validator.
> My question is whether there is some other way to influence how type
> inference is performed for division.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)