[ 
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)

Reply via email to