You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by ma...@apache.org on 2022/09/06 08:53:26 UTC

[spark] branch master updated: [SPARK-40300][SQL] Migrate onto the `DATATYPE_MISMATCH` error class

This is an automated email from the ASF dual-hosted git repository.

maxgekk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/master by this push:
     new 1e0e1ffb5c0 [SPARK-40300][SQL] Migrate onto the `DATATYPE_MISMATCH` error class
1e0e1ffb5c0 is described below

commit 1e0e1ffb5c01f7502dcc8f46f046a69c265e40f4
Author: Max Gekk <ma...@gmail.com>
AuthorDate: Tue Sep 6 11:53:01 2022 +0300

    [SPARK-40300][SQL] Migrate onto the `DATATYPE_MISMATCH` error class
    
    ### What changes were proposed in this pull request?
    In the PR, I propose to introduce new error class `DATATYPE_MISMATCH` with the following 2 error sub-classes:
    - BINARY_OP_DIFF_TYPES
    - BINARY_OP_WRONG_TYPE
    
    and new sub-class of `TypeCheckResult` which represents an error of data type mismatch: `DataTypeMismatch`. The last one will be mapped to the error class `DATATYPE_MISMATCH` with the specified sub-class + message parameters.
    
    Also I modified `BinaryOperator` to migrate on new `DataTypeMismatch` in `checkInputDataTypes()`, and regenerated the SQL golden files.
    
    ### Why are the changes needed?
    The migration onto error classes makes the errors searchable in docs, and allows to edit error's text messages w/o modifying the source code.
    
    ### Does this PR introduce _any_ user-facing change?
    Yes.
    
    Before:
    ```sql
    spark-sql> select timestamp'2011-11-11 11:11:11' + '1';
    cannot resolve '(TIMESTAMP '2011-11-11 11:11:11' + CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(TIMESTAMP '2011-11-11 11:11:11' + CAST('1' AS DOUBLE))' (timestamp and double).; line 1 pos 7;
    ```
    
    After:
    ```sql
    spark-sql> select timestamp'2011-11-11 11:11:11' + '1';
    [DATATYPE_MISMATCH.BINARY_OP_DIFF_TYPES] Cannot resolve "(TIMESTAMP '2011-11-11 11:11:11' + 1)" due to data type mismatch: the left and right arguments of the binary operator have different types ("TIMESTAMP" and "DOUBLE").; line 1 pos 7;
    ```
    The output contains an error class + sub-class, no duplicate of the SQL expression, quoting by " of the SQL expression, types in the upper case w/ ".
    
    ### How was this patch tested?
    By running the affected test suites:
    ```
    $ build/sbt "sql/testOnly org.apache.spark.sql.SQLQueryTestSuite"
    $ build/sbt "core/testOnly *SparkThrowableSuite"
    $ build/sbt "test:testOnly *ExpressionTypeCheckingSuite"
    $ build/sbt "test:testOnly *SQLQuerySuite"
    ```
    
    Closes #37744 from MaxGekk/type-mismatch-error-class.
    
    Lead-authored-by: Max Gekk <ma...@gmail.com>
    Co-authored-by: Maxim Gekk <ma...@gmail.com>
    Signed-off-by: Max Gekk <ma...@gmail.com>
---
 core/src/main/resources/error/error-classes.json   |   17 +
 .../sql/catalyst/analysis/CheckAnalysis.scala      |    5 +-
 .../sql/catalyst/analysis/TypeCheckResult.scala    |   13 +
 .../spark/sql/catalyst/analysis/package.scala      |   13 +-
 .../sql/catalyst/expressions/Expression.scala      |   15 +-
 .../apache/spark/sql/errors/QueryErrorsBase.scala  |    8 +-
 .../analysis/ExpressionTypeCheckingSuite.scala     |  200 +-
 .../sql-tests/results/ansi/interval.sql.out        |  280 +-
 .../sql-tests/results/ansi/timestamp.sql.out       |   40 +-
 .../sql-tests/results/datetime-legacy.sql.out      |   40 +-
 .../resources/sql-tests/results/having.sql.out     |   10 +-
 .../resources/sql-tests/results/interval.sql.out   |  280 +-
 .../resources/sql-tests/results/timestamp.sql.out  |   40 +-
 .../results/timestampNTZ/timestamp-ansi.sql.out    |   40 +-
 .../results/timestampNTZ/timestamp.sql.out         |   40 +-
 .../typeCoercion/native/booleanEquality.sql.out    |  240 +-
 .../typeCoercion/native/decimalPrecision.sql.out   | 3280 ++++++++++++++++++--
 .../results/typeCoercion/native/division.sql.out   |  800 ++++-
 .../typeCoercion/native/promoteStrings.sql.out     |  420 ++-
 .../scala/org/apache/spark/sql/SQLQuerySuite.scala |   17 +-
 20 files changed, 5195 insertions(+), 603 deletions(-)

diff --git a/core/src/main/resources/error/error-classes.json b/core/src/main/resources/error/error-classes.json
index 6a9652b4c67..b923d5a39e0 100644
--- a/core/src/main/resources/error/error-classes.json
+++ b/core/src/main/resources/error/error-classes.json
@@ -75,6 +75,23 @@
       "The value <str> (<fmt>) cannot be converted to <targetType> because it is malformed. Correct the value as per the syntax, or change its format. Use <suggestion> to tolerate malformed input and return NULL instead."
     ]
   },
+  "DATATYPE_MISMATCH" : {
+    "message" : [
+      "Cannot resolve <sqlExpr> due to data type mismatch:"
+    ],
+    "subClass" : {
+      "BINARY_OP_DIFF_TYPES" : {
+        "message" : [
+          "the left and right operands of the binary operator have incompatible types (<left> and <right>)."
+        ]
+      },
+      "BINARY_OP_WRONG_TYPE" : {
+        "message" : [
+          "the binary operator requires the input type <inputType>, not <actualDataType>."
+        ]
+      }
+    }
+  },
   "DATETIME_OVERFLOW" : {
     "message" : [
       "Datetime operation overflow: <operation>."
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala
index ec9d8aab3af..c1d70ccfe90 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala
@@ -211,6 +211,9 @@ trait CheckAnalysis extends PredicateHelper with LookupCatalog {
 
           case e: Expression if e.checkInputDataTypes().isFailure =>
             e.checkInputDataTypes() match {
+              case checkRes: TypeCheckResult.DataTypeMismatch =>
+                e.setTagValue(DATA_TYPE_MISMATCH_ERROR, true)
+                e.dataTypeMismatch(e, checkRes)
               case TypeCheckResult.TypeCheckFailure(message) =>
                 e.setTagValue(DATA_TYPE_MISMATCH_ERROR, true)
                 e.failAnalysis(
@@ -694,7 +697,7 @@ trait CheckAnalysis extends PredicateHelper with LookupCatalog {
         case e: Expression if e.getTagValue(DATA_TYPE_MISMATCH_ERROR).contains(true) &&
             e.checkInputDataTypes().isFailure =>
           e.checkInputDataTypes() match {
-            case TypeCheckResult.TypeCheckFailure(_) =>
+            case TypeCheckResult.TypeCheckFailure(_) | _: TypeCheckResult.DataTypeMismatch =>
               issueFixedIfAnsiOff = false
           }
 
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCheckResult.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCheckResult.scala
index d4350598f47..b6448b2f734 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCheckResult.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCheckResult.scala
@@ -42,4 +42,17 @@ object TypeCheckResult {
   case class TypeCheckFailure(message: String) extends TypeCheckResult {
     def isSuccess: Boolean = false
   }
+
+  /**
+   * Represents an error of data type mismatch with the `DATATYPE_MISMATCH` error class.
+   *
+   * @param errorSubClass A sub-class of `DATATYPE_MISMATCH`.
+   * @param messageParameters Parameters of the sub-class error message.
+   */
+  case class DataTypeMismatch(
+      errorSubClass: String,
+      messageParameters: Array[String])
+    extends TypeCheckResult {
+    def isSuccess: Boolean = false
+  }
 }
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/package.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/package.scala
index 81683adc231..10a7926242c 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/package.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/package.scala
@@ -18,7 +18,10 @@
 package org.apache.spark.sql.catalyst
 
 import org.apache.spark.sql.AnalysisException
+import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.DataTypeMismatch
+import org.apache.spark.sql.catalyst.expressions.Expression
 import org.apache.spark.sql.catalyst.trees.TreeNode
+import org.apache.spark.sql.errors.QueryErrorsBase
 
 /**
  * Provides a logical query plan [[Analyzer]] and supporting classes for performing analysis.
@@ -36,7 +39,7 @@ package object analysis {
   val caseInsensitiveResolution = (a: String, b: String) => a.equalsIgnoreCase(b)
   val caseSensitiveResolution = (a: String, b: String) => a == b
 
-  implicit class AnalysisErrorAt(t: TreeNode[_]) {
+  implicit class AnalysisErrorAt(t: TreeNode[_]) extends QueryErrorsBase {
     /** Fails the analysis at the point where a specific tree node was parsed. */
     def failAnalysis(msg: String): Nothing = {
       throw new AnalysisException(msg, t.origin.line, t.origin.startPosition)
@@ -53,6 +56,14 @@ package object analysis {
         messageParameters = messageParameters,
         origin = t.origin)
     }
+
+    def dataTypeMismatch(expr: Expression, mismatch: DataTypeMismatch): Nothing = {
+      throw new AnalysisException(
+        errorClass = "DATATYPE_MISMATCH",
+        errorSubClass = mismatch.errorSubClass,
+        messageParameters = toSQLExpr(expr) +: mismatch.messageParameters,
+        origin = t.origin)
+    }
   }
 
   /** Catches any AnalysisExceptions thrown by `f` and attaches `t`'s position if any. */
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala
index 6e431b9661c..a85e7d2efdb 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala
@@ -22,13 +22,14 @@ import java.util.Locale
 import org.apache.spark.SparkException
 import org.apache.spark.sql.catalyst.InternalRow
 import org.apache.spark.sql.catalyst.analysis.{FunctionRegistry, TypeCheckResult, TypeCoercion}
+import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.DataTypeMismatch
 import org.apache.spark.sql.catalyst.expressions.aggregate.AggregateFunction
 import org.apache.spark.sql.catalyst.expressions.codegen._
 import org.apache.spark.sql.catalyst.expressions.codegen.Block._
 import org.apache.spark.sql.catalyst.trees.{BinaryLike, LeafLike, QuaternaryLike, SQLQueryContext, TernaryLike, TreeNode, UnaryLike}
 import org.apache.spark.sql.catalyst.trees.TreePattern.{RUNTIME_REPLACEABLE, TreePattern}
 import org.apache.spark.sql.catalyst.util.truncatedString
-import org.apache.spark.sql.errors.QueryExecutionErrors
+import org.apache.spark.sql.errors.{QueryErrorsBase, QueryExecutionErrors}
 import org.apache.spark.sql.internal.SQLConf
 import org.apache.spark.sql.types._
 
@@ -741,7 +742,7 @@ object BinaryExpression {
  * 2. Two inputs are expected to be of the same type. If the two inputs have different types,
  *    the analyzer will find the tightest common type and do the proper type casting.
  */
-abstract class BinaryOperator extends BinaryExpression with ExpectsInputTypes {
+abstract class BinaryOperator extends BinaryExpression with ExpectsInputTypes with QueryErrorsBase {
 
   /**
    * Expected input type from both left/right child expressions, similar to the
@@ -760,11 +761,13 @@ abstract class BinaryOperator extends BinaryExpression with ExpectsInputTypes {
   override def checkInputDataTypes(): TypeCheckResult = {
     // First check whether left and right have the same type, then check if the type is acceptable.
     if (!left.dataType.sameType(right.dataType)) {
-      TypeCheckResult.TypeCheckFailure(s"differing types in '$sql' " +
-        s"(${left.dataType.catalogString} and ${right.dataType.catalogString}).")
+      DataTypeMismatch(
+        errorSubClass = "BINARY_OP_DIFF_TYPES",
+        messageParameters = Array(toSQLType(left.dataType), toSQLType(right.dataType)))
     } else if (!inputType.acceptsType(left.dataType)) {
-      TypeCheckResult.TypeCheckFailure(s"'$sql' requires ${inputType.simpleString} type," +
-        s" not ${left.dataType.catalogString}")
+      DataTypeMismatch(
+        errorSubClass = "BINARY_OP_WRONG_TYPE",
+        messageParameters = Array(toSQLType(inputType), toSQLType(left.dataType)))
     } else {
       TypeCheckResult.TypeCheckSuccess
     }
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryErrorsBase.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryErrorsBase.scala
index 4785073f80b..57c72f6383a 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryErrorsBase.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryErrorsBase.scala
@@ -24,7 +24,7 @@ import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute
 import org.apache.spark.sql.catalyst.expressions.{Expression, Literal}
 import org.apache.spark.sql.catalyst.trees.SQLQueryContext
 import org.apache.spark.sql.catalyst.util.{quoteIdentifier, toPrettySQL}
-import org.apache.spark.sql.types.{DataType, DoubleType, FloatType}
+import org.apache.spark.sql.types.{AbstractDataType, DataType, DoubleType, FloatType, TypeCollection}
 
 /**
  * The trait exposes util methods for preparing error messages such as quoting of error elements.
@@ -78,8 +78,10 @@ private[sql] trait QueryErrorsBase {
     toSQLId(UnresolvedAttribute.parseAttributeName(parts))
   }
 
-  def toSQLType(t: DataType): String = {
-    quoteByDefault(t.sql)
+  def toSQLType(t: AbstractDataType): String = t match {
+    case TypeCollection(types) => types.map(toSQLType).mkString("(", " or ", ")")
+    case dt: DataType => quoteByDefault(dt.sql)
+    case at => quoteByDefault(at.simpleString.toUpperCase(Locale.ROOT))
   }
 
   def toSQLType(text: String): String = {
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/ExpressionTypeCheckingSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/ExpressionTypeCheckingSuite.scala
index 986a554180c..54733fd57c5 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/ExpressionTypeCheckingSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/ExpressionTypeCheckingSuite.scala
@@ -52,9 +52,24 @@ class ExpressionTypeCheckingSuite extends SparkFunSuite with SQLHelper {
     SimpleAnalyzer.checkAnalysis(analyzed)
   }
 
-  def assertErrorForDifferingTypes(expr: Expression): Unit = {
-    assertError(expr,
-      s"differing types in '${expr.sql}'")
+  def assertErrorForDifferingTypes(
+      expr: Expression, messageParameters: Map[String, String]): Unit = {
+    checkError(
+      exception = intercept[AnalysisException] {
+        assertSuccess(expr)
+      },
+      errorClass = "DATATYPE_MISMATCH",
+      errorSubClass = Some("BINARY_OP_DIFF_TYPES"),
+      parameters = messageParameters)
+  }
+
+  def assertForWrongType(expr: Expression, messageParameters: Map[String, String]): Unit = {
+    checkError(
+      exception = intercept[AnalysisException] {
+        assertSuccess(expr)
+      }, errorClass = "DATATYPE_MISMATCH",
+      errorSubClass = Some("BINARY_OP_WRONG_TYPE"),
+      parameters = messageParameters)
   }
 
   test("check types for unary arithmetic") {
@@ -70,29 +85,106 @@ class ExpressionTypeCheckingSuite extends SparkFunSuite with SQLHelper {
     assertSuccess(Remainder($"intField", $"stringField"))
     // checkAnalysis(BitwiseAnd($"intField", $"stringField"))
 
-    assertErrorForDifferingTypes(Add($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(Subtract($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(Multiply($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(Divide($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(Remainder($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(BitwiseAnd($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(BitwiseOr($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(BitwiseXor($"intField", $"booleanField"))
+    assertErrorForDifferingTypes(
+      expr = Add($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField + booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = Subtract($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField - booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = Multiply($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField * booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = Divide($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField / booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = Remainder($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField % booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = BitwiseAnd($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField & booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = BitwiseOr($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField | booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = BitwiseXor($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField ^ booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
 
-    assertError(Add($"booleanField", $"booleanField"),
-      "requires (numeric or interval day to second or interval year to month or interval) type")
-    assertError(Subtract($"booleanField", $"booleanField"),
-      "requires (numeric or interval day to second or interval year to month or interval) type")
-    assertError(Multiply($"booleanField", $"booleanField"), "requires numeric type")
-    assertError(Divide($"booleanField", $"booleanField"),
-      "requires (double or decimal) type")
-    assertError(Remainder($"booleanField", $"booleanField"), "requires numeric type")
+    // scalastyle:off line.size.limit
+    assertForWrongType(
+      expr = Add($"booleanField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(booleanField + booleanField)\"",
+        "inputType" -> "(\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL\")",
+        "actualDataType" -> "\"BOOLEAN\""))
+    assertForWrongType(
+      expr = Subtract($"booleanField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(booleanField - booleanField)\"",
+        "inputType" -> "(\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL\")",
+        "actualDataType" -> "\"BOOLEAN\""))
+    assertForWrongType(
+      expr = Multiply($"booleanField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(booleanField * booleanField)\"",
+        "inputType" -> "\"NUMERIC\"",
+        "actualDataType" -> "\"BOOLEAN\""))
+    assertForWrongType(
+      expr = Divide($"booleanField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(booleanField / booleanField)\"",
+        "inputType" -> "(\"DOUBLE\" or \"DECIMAL\")",
+        "actualDataType" -> "\"BOOLEAN\""))
+    assertForWrongType(
+      expr = Remainder($"booleanField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(booleanField % booleanField)\"",
+        "inputType" -> "\"NUMERIC\"",
+        "actualDataType" -> "\"BOOLEAN\""))
 
-    assertError(BitwiseAnd($"booleanField", $"booleanField"),
-      "requires integral type")
-    assertError(BitwiseOr($"booleanField", $"booleanField"), "requires integral type")
-    assertError(BitwiseXor($"booleanField", $"booleanField"),
-      "requires integral type")
+    assertForWrongType(
+      expr = BitwiseAnd($"booleanField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(booleanField & booleanField)\"",
+        "inputType" -> "\"INTEGRAL\"",
+        "actualDataType" -> "\"BOOLEAN\""))
+    assertForWrongType(
+      expr = BitwiseOr($"booleanField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(booleanField | booleanField)\"",
+        "inputType" -> "\"INTEGRAL\"",
+        "actualDataType" -> "\"BOOLEAN\""))
+    assertForWrongType(
+      expr = BitwiseXor($"booleanField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(booleanField ^ booleanField)\"",
+        "inputType" -> "\"INTEGRAL\"",
+        "actualDataType" -> "\"BOOLEAN\""))
+    // scalastyle:on line.size.limit
   }
 
   test("check types for predicates") {
@@ -110,16 +202,56 @@ class ExpressionTypeCheckingSuite extends SparkFunSuite with SQLHelper {
       assertSuccess(EqualNullSafe($"intField", $"booleanField"))
     }
     withSQLConf(SQLConf.ANSI_ENABLED.key -> "true") {
-      assertError(EqualTo($"intField", $"booleanField"), "differing types")
-      assertError(EqualNullSafe($"intField", $"booleanField"), "differing types")
+      assertErrorForDifferingTypes(
+        expr = EqualTo($"intField", $"booleanField"),
+        messageParameters = Map(
+          "sqlExpr" -> "\"(intField = booleanField)\"",
+          "left" -> "\"INT\"",
+          "right" -> "\"BOOLEAN\""))
+      assertErrorForDifferingTypes(
+        expr = EqualNullSafe($"intField", $"booleanField"),
+        messageParameters = Map(
+          "sqlExpr" -> "\"(intField <=> booleanField)\"",
+          "left" -> "\"INT\"",
+          "right" -> "\"BOOLEAN\""))
     }
 
-    assertErrorForDifferingTypes(EqualTo($"intField", $"mapField"))
-    assertErrorForDifferingTypes(EqualNullSafe($"intField", $"mapField"))
-    assertErrorForDifferingTypes(LessThan($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(LessThanOrEqual($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(GreaterThan($"intField", $"booleanField"))
-    assertErrorForDifferingTypes(GreaterThanOrEqual($"intField", $"booleanField"))
+    assertErrorForDifferingTypes(
+      expr = EqualTo($"intField", $"mapField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField = mapField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"MAP<STRING, BIGINT>\""))
+    assertErrorForDifferingTypes(
+      expr = EqualNullSafe($"intField", $"mapField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField <=> mapField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"MAP<STRING, BIGINT>\""))
+    assertErrorForDifferingTypes(
+      expr = LessThan($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField < booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = LessThanOrEqual($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField <= booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = GreaterThan($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField > booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
+    assertErrorForDifferingTypes(
+      expr = GreaterThanOrEqual($"intField", $"booleanField"),
+      messageParameters = Map(
+        "sqlExpr" -> "\"(intField >= booleanField)\"",
+        "left" -> "\"INT\"",
+        "right" -> "\"BOOLEAN\""))
 
     assertError(EqualTo($"mapField", $"mapField"),
       "EqualTo does not support ordering on type map")
@@ -136,8 +268,8 @@ class ExpressionTypeCheckingSuite extends SparkFunSuite with SQLHelper {
 
     assertError(If($"intField", $"stringField", $"stringField"),
       "type of predicate expression in If should be boolean")
-    assertErrorForDifferingTypes(
-      If($"booleanField", $"intField", $"booleanField"))
+    assertError(If($"booleanField", $"intField", $"booleanField"),
+      "data type mismatch")
 
     assertError(
       CaseWhen(Seq(($"booleanField".attr, $"intField".attr),
diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/interval.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/interval.sql.out
index 32c30c94b14..bdab9174f8e 100644
--- a/sql/core/src/test/resources/sql-tests/results/ansi/interval.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/ansi/interval.sql.out
@@ -285,7 +285,15 @@ select '2' / interval 2 second
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('2' / INTERVAL '02' SECOND)' due to data type mismatch: differing types in '('2' / INTERVAL '02' SECOND)' (string and interval second).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(2 / INTERVAL '02' SECOND)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL SECOND\""
+  }
+}
 
 
 -- !query
@@ -294,7 +302,15 @@ select '2' / interval 2 year
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('2' / INTERVAL '2' YEAR)' due to data type mismatch: differing types in '('2' / INTERVAL '2' YEAR)' (string and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(2 / INTERVAL '2' YEAR)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -389,7 +405,15 @@ select 2 / interval '2' year
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(2 / INTERVAL '2' YEAR)' due to data type mismatch: differing types in '(2 / INTERVAL '2' YEAR)' (int and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(2 / INTERVAL '2' YEAR)\"",
+    "left" : "\"INT\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -398,7 +422,15 @@ select 2 / interval '2' hour
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(2 / INTERVAL '02' HOUR)' due to data type mismatch: differing types in '(2 / INTERVAL '02' HOUR)' (int and interval hour).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(2 / INTERVAL '02' HOUR)\"",
+    "left" : "\"INT\"",
+    "right" : "\"INTERVAL HOUR\""
+  }
+}
 
 
 -- !query
@@ -407,7 +439,15 @@ select null / interval '2' year
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL / INTERVAL '2' YEAR)' due to data type mismatch: differing types in '(NULL / INTERVAL '2' YEAR)' (void and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL / INTERVAL '2' YEAR)\"",
+    "left" : "\"VOID\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -416,7 +456,15 @@ select null / interval '2' hour
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL / INTERVAL '02' HOUR)' due to data type mismatch: differing types in '(NULL / INTERVAL '02' HOUR)' (void and interval hour).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL / INTERVAL '02' HOUR)\"",
+    "left" : "\"VOID\"",
+    "right" : "\"INTERVAL HOUR\""
+  }
+}
 
 
 -- !query
@@ -1579,7 +1627,15 @@ select
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR + '3-3 year to month')' due to data type mismatch: differing types in '(INTERVAL '2' YEAR + '3-3 year to month')' (interval year and string).; line 2 pos 2
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR + 3-3 year to month)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -1604,7 +1660,15 @@ select interval '2' year + '3-3'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR + '3-3')' due to data type mismatch: differing types in '(INTERVAL '2' YEAR + '3-3')' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR + 3-3)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -1613,7 +1677,15 @@ select interval '2' year - '4'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR - '4')' due to data type mismatch: differing types in '(INTERVAL '2' YEAR - '4')' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR - 4)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -1680,7 +1752,15 @@ select interval '2' year + str from interval_view
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR + interval_view.str)' due to data type mismatch: differing types in '(INTERVAL '2' YEAR + interval_view.str)' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR + str)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -1689,7 +1769,15 @@ select interval '2' year - str from interval_view
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR - interval_view.str)' due to data type mismatch: differing types in '(INTERVAL '2' YEAR - interval_view.str)' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR - str)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -1775,7 +1863,15 @@ select interval '3' day - interval '2-2' year to month
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '3' DAY - INTERVAL '2-2' YEAR TO MONTH)' due to data type mismatch: differing types in '(INTERVAL '3' DAY - INTERVAL '2-2' YEAR TO MONTH)' (interval day and interval year to month).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '3' DAY - INTERVAL '2-2' YEAR TO MONTH)\"",
+    "left" : "\"INTERVAL DAY\"",
+    "right" : "\"INTERVAL YEAR TO MONTH\""
+  }
+}
 
 
 -- !query
@@ -1793,7 +1889,15 @@ select 1 + interval '2' month
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(1 + INTERVAL '2' MONTH)' due to data type mismatch: differing types in '(1 + INTERVAL '2' MONTH)' (int and interval month).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + INTERVAL '2' MONTH)\"",
+    "left" : "\"INT\"",
+    "right" : "\"INTERVAL MONTH\""
+  }
+}
 
 
 -- !query
@@ -1811,7 +1915,15 @@ select interval '2' month - 1
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' MONTH - 1)' due to data type mismatch: differing types in '(INTERVAL '2' MONTH - 1)' (interval month and int).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' MONTH - 1)\"",
+    "left" : "\"INTERVAL MONTH\"",
+    "right" : "\"INT\""
+  }
+}
 
 
 -- !query
@@ -2667,7 +2779,15 @@ SELECT INTERVAL 1 MONTH > INTERVAL 20 DAYS
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' MONTH > INTERVAL '20' DAY)' due to data type mismatch: differing types in '(INTERVAL '1' MONTH > INTERVAL '20' DAY)' (interval month and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' MONTH > INTERVAL '20' DAY)\"",
+    "left" : "\"INTERVAL MONTH\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
@@ -2676,7 +2796,15 @@ SELECT INTERVAL '1' DAY < '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' DAY < '1')' due to data type mismatch: differing types in '(INTERVAL '1' DAY < '1')' (interval day and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' DAY < 1)\"",
+    "left" : "\"INTERVAL DAY\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2685,7 +2813,15 @@ SELECT INTERVAL '1' DAY = '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' DAY = '1')' due to data type mismatch: differing types in '(INTERVAL '1' DAY = '1')' (interval day and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' DAY = 1)\"",
+    "left" : "\"INTERVAL DAY\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2694,7 +2830,15 @@ SELECT INTERVAL '1' DAY > '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' DAY > '1')' due to data type mismatch: differing types in '(INTERVAL '1' DAY > '1')' (interval day and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' DAY > 1)\"",
+    "left" : "\"INTERVAL DAY\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2703,7 +2847,15 @@ SELECT '1' < INTERVAL '1' DAY
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' < INTERVAL '1' DAY)' due to data type mismatch: differing types in '('1' < INTERVAL '1' DAY)' (string and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 < INTERVAL '1' DAY)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
@@ -2712,7 +2864,15 @@ SELECT '1' = INTERVAL '1' DAY
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' = INTERVAL '1' DAY)' due to data type mismatch: differing types in '('1' = INTERVAL '1' DAY)' (string and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 = INTERVAL '1' DAY)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
@@ -2721,7 +2881,15 @@ SELECT '1' > INTERVAL '1' DAY
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' > INTERVAL '1' DAY)' due to data type mismatch: differing types in '('1' > INTERVAL '1' DAY)' (string and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 > INTERVAL '1' DAY)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
@@ -2730,7 +2898,15 @@ SELECT INTERVAL '1' YEAR < '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' YEAR < '1')' due to data type mismatch: differing types in '(INTERVAL '1' YEAR < '1')' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' YEAR < 1)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2739,7 +2915,15 @@ SELECT INTERVAL '1' YEAR = '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' YEAR = '1')' due to data type mismatch: differing types in '(INTERVAL '1' YEAR = '1')' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' YEAR = 1)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2748,7 +2932,15 @@ SELECT INTERVAL '1' YEAR > '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' YEAR > '1')' due to data type mismatch: differing types in '(INTERVAL '1' YEAR > '1')' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' YEAR > 1)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2757,7 +2949,15 @@ SELECT '1' < INTERVAL '1' YEAR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' < INTERVAL '1' YEAR)' due to data type mismatch: differing types in '('1' < INTERVAL '1' YEAR)' (string and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 < INTERVAL '1' YEAR)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -2766,7 +2966,15 @@ SELECT '1' = INTERVAL '1' YEAR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' = INTERVAL '1' YEAR)' due to data type mismatch: differing types in '('1' = INTERVAL '1' YEAR)' (string and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 = INTERVAL '1' YEAR)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -2775,7 +2983,15 @@ SELECT '1' > INTERVAL '1' YEAR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' > INTERVAL '1' YEAR)' due to data type mismatch: differing types in '('1' > INTERVAL '1' YEAR)' (string and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 > INTERVAL '1' YEAR)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -2882,7 +3098,15 @@ SELECT div(INTERVAL '1' MONTH, INTERVAL '-1' DAY)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' MONTH div INTERVAL '-1' DAY)' due to data type mismatch: differing types in '(INTERVAL '1' MONTH div INTERVAL '-1' DAY)' (interval month and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' MONTH div INTERVAL '-1' DAY)\"",
+    "left" : "\"INTERVAL MONTH\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/timestamp.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/timestamp.sql.out
index 99d34b67e72..801d1a38d4a 100644
--- a/sql/core/src/test/resources/sql-tests/results/ansi/timestamp.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/ansi/timestamp.sql.out
@@ -719,7 +719,15 @@ select timestamp'2011-11-11 11:11:11' + '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP '2011-11-11 11:11:11' + CAST('1' AS TIMESTAMP))' due to data type mismatch: '(TIMESTAMP '2011-11-11 11:11:11' + CAST('1' AS TIMESTAMP))' requires (numeric or interval day to second or interval year to month or interval) type, not timestamp; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_WRONG_TYPE",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP '2011-11-11 11:11:11' + 1)\"",
+    "inputType" : "(\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL\")",
+    "actualDataType" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -728,7 +736,15 @@ select '1' + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS TIMESTAMP) + TIMESTAMP '2011-11-11 11:11:11')' due to data type mismatch: '(CAST('1' AS TIMESTAMP) + TIMESTAMP '2011-11-11 11:11:11')' requires (numeric or interval day to second or interval year to month or interval) type, not timestamp; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_WRONG_TYPE",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + TIMESTAMP '2011-11-11 11:11:11')\"",
+    "inputType" : "(\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL\")",
+    "actualDataType" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -737,7 +753,15 @@ select timestamp'2011-11-11 11:11:11' + null
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP '2011-11-11 11:11:11' + NULL)' due to data type mismatch: differing types in '(TIMESTAMP '2011-11-11 11:11:11' + NULL)' (timestamp and void).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP '2011-11-11 11:11:11' + NULL)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"VOID\""
+  }
+}
 
 
 -- !query
@@ -746,7 +770,15 @@ select null + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL + TIMESTAMP '2011-11-11 11:11:11')' due to data type mismatch: differing types in '(NULL + TIMESTAMP '2011-11-11 11:11:11')' (void and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL + TIMESTAMP '2011-11-11 11:11:11')\"",
+    "left" : "\"VOID\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out b/sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out
index e801a165d2e..34dcea2831a 100644
--- a/sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/datetime-legacy.sql.out
@@ -1493,7 +1493,15 @@ select timestamp'2011-11-11 11:11:11' + '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP '2011-11-11 11:11:11' + CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(TIMESTAMP '2011-11-11 11:11:11' + CAST('1' AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP '2011-11-11 11:11:11' + 1)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1502,7 +1510,15 @@ select '1' + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) + TIMESTAMP '2011-11-11 11:11:11')' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) + TIMESTAMP '2011-11-11 11:11:11')' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + TIMESTAMP '2011-11-11 11:11:11')\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -1511,7 +1527,15 @@ select timestamp'2011-11-11 11:11:11' + null
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP '2011-11-11 11:11:11' + NULL)' due to data type mismatch: differing types in '(TIMESTAMP '2011-11-11 11:11:11' + NULL)' (timestamp and void).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP '2011-11-11 11:11:11' + NULL)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"VOID\""
+  }
+}
 
 
 -- !query
@@ -1520,7 +1544,15 @@ select null + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL + TIMESTAMP '2011-11-11 11:11:11')' due to data type mismatch: differing types in '(NULL + TIMESTAMP '2011-11-11 11:11:11')' (void and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL + TIMESTAMP '2011-11-11 11:11:11')\"",
+    "left" : "\"VOID\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/resources/sql-tests/results/having.sql.out b/sql/core/src/test/resources/sql-tests/results/having.sql.out
index e9e24562d1b..88cafacffdf 100644
--- a/sql/core/src/test/resources/sql-tests/results/having.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/having.sql.out
@@ -35,7 +35,15 @@ SELECT count(k) FROM hav GROUP BY v HAVING v = array(1)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(hav.v = array(1))' due to data type mismatch: differing types in '(hav.v = array(1))' (int and array<int>).; line 1 pos 43
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(v = array(1))\"",
+    "left" : "\"INT\"",
+    "right" : "\"ARRAY<INT>\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/resources/sql-tests/results/interval.sql.out b/sql/core/src/test/resources/sql-tests/results/interval.sql.out
index c0be7df1e8a..06a0a14e6d4 100644
--- a/sql/core/src/test/resources/sql-tests/results/interval.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/interval.sql.out
@@ -183,7 +183,15 @@ select '2' / interval 2 second
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2' AS DOUBLE) / INTERVAL '02' SECOND)' due to data type mismatch: differing types in '(CAST('2' AS DOUBLE) / INTERVAL '02' SECOND)' (double and interval second).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(2 / INTERVAL '02' SECOND)\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"INTERVAL SECOND\""
+  }
+}
 
 
 -- !query
@@ -192,7 +200,15 @@ select '2' / interval 2 year
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2' AS DOUBLE) / INTERVAL '2' YEAR)' due to data type mismatch: differing types in '(CAST('2' AS DOUBLE) / INTERVAL '2' YEAR)' (double and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(2 / INTERVAL '2' YEAR)\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -287,7 +303,15 @@ select 2 / interval '2' year
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(2 / INTERVAL '2' YEAR)' due to data type mismatch: differing types in '(2 / INTERVAL '2' YEAR)' (int and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(2 / INTERVAL '2' YEAR)\"",
+    "left" : "\"INT\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -296,7 +320,15 @@ select 2 / interval '2' hour
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(2 / INTERVAL '02' HOUR)' due to data type mismatch: differing types in '(2 / INTERVAL '02' HOUR)' (int and interval hour).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(2 / INTERVAL '02' HOUR)\"",
+    "left" : "\"INT\"",
+    "right" : "\"INTERVAL HOUR\""
+  }
+}
 
 
 -- !query
@@ -305,7 +337,15 @@ select null / interval '2' year
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL / INTERVAL '2' YEAR)' due to data type mismatch: differing types in '(NULL / INTERVAL '2' YEAR)' (void and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL / INTERVAL '2' YEAR)\"",
+    "left" : "\"VOID\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -314,7 +354,15 @@ select null / interval '2' hour
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL / INTERVAL '02' HOUR)' due to data type mismatch: differing types in '(NULL / INTERVAL '02' HOUR)' (void and interval hour).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL / INTERVAL '02' HOUR)\"",
+    "left" : "\"VOID\"",
+    "right" : "\"INTERVAL HOUR\""
+  }
+}
 
 
 -- !query
@@ -1460,7 +1508,15 @@ select
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR + CAST('3-3 year to month' AS DOUBLE))' due to data type mismatch: differing types in '(INTERVAL '2' YEAR + CAST('3-3 year to month' AS DOUBLE))' (interval year and double).; line 2 pos 2
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR + 3-3 year to month)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1485,7 +1541,15 @@ select interval '2' year + '3-3'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR + CAST('3-3' AS DOUBLE))' due to data type mismatch: differing types in '(INTERVAL '2' YEAR + CAST('3-3' AS DOUBLE))' (interval year and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR + 3-3)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1494,7 +1558,15 @@ select interval '2' year - '4'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR - CAST('4' AS DOUBLE))' due to data type mismatch: differing types in '(INTERVAL '2' YEAR - CAST('4' AS DOUBLE))' (interval year and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR - 4)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1527,7 +1599,15 @@ select interval '2' year + str from interval_view
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR + CAST(interval_view.str AS DOUBLE))' due to data type mismatch: differing types in '(INTERVAL '2' YEAR + CAST(interval_view.str AS DOUBLE))' (interval year and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR + str)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1536,7 +1616,15 @@ select interval '2' year - str from interval_view
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' YEAR - CAST(interval_view.str AS DOUBLE))' due to data type mismatch: differing types in '(INTERVAL '2' YEAR - CAST(interval_view.str AS DOUBLE))' (interval year and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' YEAR - str)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1588,7 +1676,15 @@ select interval '3' day - interval '2-2' year to month
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '3' DAY - INTERVAL '2-2' YEAR TO MONTH)' due to data type mismatch: differing types in '(INTERVAL '3' DAY - INTERVAL '2-2' YEAR TO MONTH)' (interval day and interval year to month).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '3' DAY - INTERVAL '2-2' YEAR TO MONTH)\"",
+    "left" : "\"INTERVAL DAY\"",
+    "right" : "\"INTERVAL YEAR TO MONTH\""
+  }
+}
 
 
 -- !query
@@ -1606,7 +1702,15 @@ select 1 + interval '2' month
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(1 + INTERVAL '2' MONTH)' due to data type mismatch: differing types in '(1 + INTERVAL '2' MONTH)' (int and interval month).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + INTERVAL '2' MONTH)\"",
+    "left" : "\"INT\"",
+    "right" : "\"INTERVAL MONTH\""
+  }
+}
 
 
 -- !query
@@ -1624,7 +1728,15 @@ select interval '2' month - 1
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '2' MONTH - 1)' due to data type mismatch: differing types in '(INTERVAL '2' MONTH - 1)' (interval month and int).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '2' MONTH - 1)\"",
+    "left" : "\"INTERVAL MONTH\"",
+    "right" : "\"INT\""
+  }
+}
 
 
 -- !query
@@ -2480,7 +2592,15 @@ SELECT INTERVAL 1 MONTH > INTERVAL 20 DAYS
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' MONTH > INTERVAL '20' DAY)' due to data type mismatch: differing types in '(INTERVAL '1' MONTH > INTERVAL '20' DAY)' (interval month and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' MONTH > INTERVAL '20' DAY)\"",
+    "left" : "\"INTERVAL MONTH\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
@@ -2489,7 +2609,15 @@ SELECT INTERVAL '1' DAY < '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' DAY < '1')' due to data type mismatch: differing types in '(INTERVAL '1' DAY < '1')' (interval day and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' DAY < 1)\"",
+    "left" : "\"INTERVAL DAY\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2498,7 +2626,15 @@ SELECT INTERVAL '1' DAY = '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' DAY = '1')' due to data type mismatch: differing types in '(INTERVAL '1' DAY = '1')' (interval day and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' DAY = 1)\"",
+    "left" : "\"INTERVAL DAY\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2507,7 +2643,15 @@ SELECT INTERVAL '1' DAY > '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' DAY > '1')' due to data type mismatch: differing types in '(INTERVAL '1' DAY > '1')' (interval day and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' DAY > 1)\"",
+    "left" : "\"INTERVAL DAY\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2516,7 +2660,15 @@ SELECT '1' < INTERVAL '1' DAY
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' < INTERVAL '1' DAY)' due to data type mismatch: differing types in '('1' < INTERVAL '1' DAY)' (string and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 < INTERVAL '1' DAY)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
@@ -2525,7 +2677,15 @@ SELECT '1' = INTERVAL '1' DAY
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' = INTERVAL '1' DAY)' due to data type mismatch: differing types in '('1' = INTERVAL '1' DAY)' (string and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 = INTERVAL '1' DAY)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
@@ -2534,7 +2694,15 @@ SELECT '1' > INTERVAL '1' DAY
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' > INTERVAL '1' DAY)' due to data type mismatch: differing types in '('1' > INTERVAL '1' DAY)' (string and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 > INTERVAL '1' DAY)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
@@ -2543,7 +2711,15 @@ SELECT INTERVAL '1' YEAR < '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' YEAR < '1')' due to data type mismatch: differing types in '(INTERVAL '1' YEAR < '1')' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' YEAR < 1)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2552,7 +2728,15 @@ SELECT INTERVAL '1' YEAR = '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' YEAR = '1')' due to data type mismatch: differing types in '(INTERVAL '1' YEAR = '1')' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' YEAR = 1)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2561,7 +2745,15 @@ SELECT INTERVAL '1' YEAR > '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' YEAR > '1')' due to data type mismatch: differing types in '(INTERVAL '1' YEAR > '1')' (interval year and string).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' YEAR > 1)\"",
+    "left" : "\"INTERVAL YEAR\"",
+    "right" : "\"STRING\""
+  }
+}
 
 
 -- !query
@@ -2570,7 +2762,15 @@ SELECT '1' < INTERVAL '1' YEAR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' < INTERVAL '1' YEAR)' due to data type mismatch: differing types in '('1' < INTERVAL '1' YEAR)' (string and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 < INTERVAL '1' YEAR)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -2579,7 +2779,15 @@ SELECT '1' = INTERVAL '1' YEAR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' = INTERVAL '1' YEAR)' due to data type mismatch: differing types in '('1' = INTERVAL '1' YEAR)' (string and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 = INTERVAL '1' YEAR)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -2588,7 +2796,15 @@ SELECT '1' > INTERVAL '1' YEAR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '('1' > INTERVAL '1' YEAR)' due to data type mismatch: differing types in '('1' > INTERVAL '1' YEAR)' (string and interval year).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 > INTERVAL '1' YEAR)\"",
+    "left" : "\"STRING\"",
+    "right" : "\"INTERVAL YEAR\""
+  }
+}
 
 
 -- !query
@@ -2695,7 +2911,15 @@ SELECT div(INTERVAL '1' MONTH, INTERVAL '-1' DAY)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(INTERVAL '1' MONTH div INTERVAL '-1' DAY)' due to data type mismatch: differing types in '(INTERVAL '1' MONTH div INTERVAL '-1' DAY)' (interval month and interval day).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(INTERVAL '1' MONTH div INTERVAL '-1' DAY)\"",
+    "left" : "\"INTERVAL MONTH\"",
+    "right" : "\"INTERVAL DAY\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/resources/sql-tests/results/timestamp.sql.out b/sql/core/src/test/resources/sql-tests/results/timestamp.sql.out
index 3e15bdf15e1..16698dcef57 100644
--- a/sql/core/src/test/resources/sql-tests/results/timestamp.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/timestamp.sql.out
@@ -665,7 +665,15 @@ select timestamp'2011-11-11 11:11:11' + '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP '2011-11-11 11:11:11' + CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(TIMESTAMP '2011-11-11 11:11:11' + CAST('1' AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP '2011-11-11 11:11:11' + 1)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -674,7 +682,15 @@ select '1' + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) + TIMESTAMP '2011-11-11 11:11:11')' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) + TIMESTAMP '2011-11-11 11:11:11')' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + TIMESTAMP '2011-11-11 11:11:11')\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -683,7 +699,15 @@ select timestamp'2011-11-11 11:11:11' + null
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP '2011-11-11 11:11:11' + NULL)' due to data type mismatch: differing types in '(TIMESTAMP '2011-11-11 11:11:11' + NULL)' (timestamp and void).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP '2011-11-11 11:11:11' + NULL)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"VOID\""
+  }
+}
 
 
 -- !query
@@ -692,7 +716,15 @@ select null + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL + TIMESTAMP '2011-11-11 11:11:11')' due to data type mismatch: differing types in '(NULL + TIMESTAMP '2011-11-11 11:11:11')' (void and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL + TIMESTAMP '2011-11-11 11:11:11')\"",
+    "left" : "\"VOID\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out
index 6494f530076..c16dc6c82b6 100644
--- a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out
@@ -734,7 +734,15 @@ select timestamp'2011-11-11 11:11:11' + '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP_NTZ '2011-11-11 11:11:11' + CAST('1' AS TIMESTAMP_NTZ))' due to data type mismatch: '(TIMESTAMP_NTZ '2011-11-11 11:11:11' + CAST('1' AS TIMESTAMP_NTZ))' requires (numeric or interval day to second or interval year to month or interval) type, not timestamp_ntz; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_WRONG_TYPE",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP_NTZ '2011-11-11 11:11:11' + 1)\"",
+    "inputType" : "(\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL\")",
+    "actualDataType" : "\"TIMESTAMP_NTZ\""
+  }
+}
 
 
 -- !query
@@ -743,7 +751,15 @@ select '1' + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS TIMESTAMP_NTZ) + TIMESTAMP_NTZ '2011-11-11 11:11:11')' due to data type mismatch: '(CAST('1' AS TIMESTAMP_NTZ) + TIMESTAMP_NTZ '2011-11-11 11:11:11')' requires (numeric or interval day to second or interval year to month or interval) type, not timestamp_ntz; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_WRONG_TYPE",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + TIMESTAMP_NTZ '2011-11-11 11:11:11')\"",
+    "inputType" : "(\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL\")",
+    "actualDataType" : "\"TIMESTAMP_NTZ\""
+  }
+}
 
 
 -- !query
@@ -752,7 +768,15 @@ select timestamp'2011-11-11 11:11:11' + null
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP_NTZ '2011-11-11 11:11:11' + NULL)' due to data type mismatch: differing types in '(TIMESTAMP_NTZ '2011-11-11 11:11:11' + NULL)' (timestamp_ntz and void).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP_NTZ '2011-11-11 11:11:11' + NULL)\"",
+    "left" : "\"TIMESTAMP_NTZ\"",
+    "right" : "\"VOID\""
+  }
+}
 
 
 -- !query
@@ -761,7 +785,15 @@ select null + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL + TIMESTAMP_NTZ '2011-11-11 11:11:11')' due to data type mismatch: differing types in '(NULL + TIMESTAMP_NTZ '2011-11-11 11:11:11')' (void and timestamp_ntz).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL + TIMESTAMP_NTZ '2011-11-11 11:11:11')\"",
+    "left" : "\"VOID\"",
+    "right" : "\"TIMESTAMP_NTZ\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp.sql.out b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp.sql.out
index 78afee51ed1..54d635ba41f 100644
--- a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp.sql.out
@@ -665,7 +665,15 @@ select timestamp'2011-11-11 11:11:11' + '1'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP_NTZ '2011-11-11 11:11:11' + CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(TIMESTAMP_NTZ '2011-11-11 11:11:11' + CAST('1' AS DOUBLE))' (timestamp_ntz and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP_NTZ '2011-11-11 11:11:11' + 1)\"",
+    "left" : "\"TIMESTAMP_NTZ\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -674,7 +682,15 @@ select '1' + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) + TIMESTAMP_NTZ '2011-11-11 11:11:11')' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) + TIMESTAMP_NTZ '2011-11-11 11:11:11')' (double and timestamp_ntz).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + TIMESTAMP_NTZ '2011-11-11 11:11:11')\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP_NTZ\""
+  }
+}
 
 
 -- !query
@@ -683,7 +699,15 @@ select timestamp'2011-11-11 11:11:11' + null
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(TIMESTAMP_NTZ '2011-11-11 11:11:11' + NULL)' due to data type mismatch: differing types in '(TIMESTAMP_NTZ '2011-11-11 11:11:11' + NULL)' (timestamp_ntz and void).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(TIMESTAMP_NTZ '2011-11-11 11:11:11' + NULL)\"",
+    "left" : "\"TIMESTAMP_NTZ\"",
+    "right" : "\"VOID\""
+  }
+}
 
 
 -- !query
@@ -692,7 +716,15 @@ select null + timestamp'2011-11-11 11:11:11'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(NULL + TIMESTAMP_NTZ '2011-11-11 11:11:11')' due to data type mismatch: differing types in '(NULL + TIMESTAMP_NTZ '2011-11-11 11:11:11')' (void and timestamp_ntz).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(NULL + TIMESTAMP_NTZ '2011-11-11 11:11:11')\"",
+    "left" : "\"VOID\"",
+    "right" : "\"TIMESTAMP_NTZ\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/booleanEquality.sql.out b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/booleanEquality.sql.out
index 75a8baea6aa..ad668bd053b 100644
--- a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/booleanEquality.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/booleanEquality.sql.out
@@ -77,7 +77,15 @@ SELECT true = cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(true = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(true = CAST('1' AS BINARY))' (boolean and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(true = CAST(1 AS BINARY))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -94,7 +102,15 @@ SELECT true = cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(true = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(true = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (boolean and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(true = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -103,7 +119,15 @@ SELECT true = cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(true = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(true = CAST('2017-12-11 09:30:00' AS DATE))' (boolean and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(true = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -176,7 +200,15 @@ SELECT true <=> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(true <=> CAST('1' AS BINARY))' due to data type mismatch: differing types in '(true <=> CAST('1' AS BINARY))' (boolean and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(true <=> CAST(1 AS BINARY))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -193,7 +225,15 @@ SELECT true <=> cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(true <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(true <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (boolean and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(true <=> CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -202,7 +242,15 @@ SELECT true <=> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(true <=> CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(true <=> CAST('2017-12-11 09:30:00' AS DATE))' (boolean and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(true <=> CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -275,7 +323,15 @@ SELECT cast('1' as binary) = true FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = true)' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = true)' (binary and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = true)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -292,7 +348,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) = true FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = true)' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = true)' (timestamp and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = true)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -301,7 +365,15 @@ SELECT cast('2017-12-11 09:30:00' as date) = true FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = true)' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = true)' (date and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = true)\"",
+    "left" : "\"DATE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -374,7 +446,15 @@ SELECT cast('1' as binary) <=> true FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <=> true)' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <=> true)' (binary and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <=> true)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -391,7 +471,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <=> true FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> true)' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> true)' (timestamp and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <=> true)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -400,7 +488,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <=> true FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <=> true)' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <=> true)' (date and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <=> true)\"",
+    "left" : "\"DATE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -473,7 +569,15 @@ SELECT false = cast('0' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(false = CAST('0' AS BINARY))' due to data type mismatch: differing types in '(false = CAST('0' AS BINARY))' (boolean and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(false = CAST(0 AS BINARY))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -490,7 +594,15 @@ SELECT false = cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(false = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(false = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (boolean and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(false = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -499,7 +611,15 @@ SELECT false = cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(false = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(false = CAST('2017-12-11 09:30:00' AS DATE))' (boolean and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(false = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -572,7 +692,15 @@ SELECT false <=> cast('0' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(false <=> CAST('0' AS BINARY))' due to data type mismatch: differing types in '(false <=> CAST('0' AS BINARY))' (boolean and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(false <=> CAST(0 AS BINARY))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -589,7 +717,15 @@ SELECT false <=> cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(false <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(false <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (boolean and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(false <=> CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -598,7 +734,15 @@ SELECT false <=> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(false <=> CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(false <=> CAST('2017-12-11 09:30:00' AS DATE))' (boolean and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(false <=> CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -671,7 +815,15 @@ SELECT cast('0' as binary) = false FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('0' AS BINARY) = false)' due to data type mismatch: differing types in '(CAST('0' AS BINARY) = false)' (binary and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(0 AS BINARY) = false)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -688,7 +840,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) = false FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = false)' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = false)' (timestamp and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = false)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -697,7 +857,15 @@ SELECT cast('2017-12-11 09:30:00' as date) = false FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = false)' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = false)' (date and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = false)\"",
+    "left" : "\"DATE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -770,7 +938,15 @@ SELECT cast('0' as binary) <=> false FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('0' AS BINARY) <=> false)' due to data type mismatch: differing types in '(CAST('0' AS BINARY) <=> false)' (binary and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(0 AS BINARY) <=> false)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -787,7 +963,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <=> false FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> false)' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> false)' (timestamp and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <=> false)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -796,4 +980,12 @@ SELECT cast('2017-12-11 09:30:00' as date) <=> false FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <=> false)' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <=> false)' (date and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <=> false)\"",
+    "left" : "\"DATE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
diff --git a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/decimalPrecision.sql.out b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/decimalPrecision.sql.out
index 2dbe93f312d..f86740f45b6 100644
--- a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/decimalPrecision.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/decimalPrecision.sql.out
@@ -237,7 +237,15 @@ SELECT cast('1' as binary) + cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) + CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) + CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) + CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -246,7 +254,15 @@ SELECT cast('1' as binary) + cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) + CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) + CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) + CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -255,7 +271,15 @@ SELECT cast('1' as binary) + cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) + CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) + CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) + CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -264,7 +288,15 @@ SELECT cast('1' as binary) + cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) + CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) + CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) + CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -273,7 +305,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) + cast(1 as decimal(3, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) + CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -282,7 +322,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) + cast(1 as decimal(5, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) + CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -291,7 +339,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) + cast(1 as decimal(10, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) + CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -300,7 +356,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) + cast(1 as decimal(20, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) + CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -601,7 +665,15 @@ SELECT cast(1 as decimal(3, 0))  + cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) + CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) + CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) + CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -610,7 +682,15 @@ SELECT cast(1 as decimal(5, 0))  + cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) + CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) + CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) + CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -619,7 +699,15 @@ SELECT cast(1 as decimal(10, 0)) + cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) + CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) + CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) + CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -628,7 +716,15 @@ SELECT cast(1 as decimal(20, 0)) + cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) + CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) + CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) + CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -637,7 +733,15 @@ SELECT cast(1 as decimal(3, 0))  + cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) + CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) + CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) + CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -646,7 +750,15 @@ SELECT cast(1 as decimal(5, 0))  + cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) + CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) + CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) + CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -655,7 +767,15 @@ SELECT cast(1 as decimal(10, 0)) + cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) + CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) + CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) + CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -664,7 +784,15 @@ SELECT cast(1 as decimal(20, 0)) + cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) + CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) + CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) + CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -673,7 +801,15 @@ SELECT cast(1 as decimal(3, 0))  + cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) + CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -682,7 +818,15 @@ SELECT cast(1 as decimal(5, 0))  + cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) + CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -691,7 +835,15 @@ SELECT cast(1 as decimal(10, 0)) + cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) + CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -700,7 +852,15 @@ SELECT cast(1 as decimal(20, 0)) + cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) + CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -969,7 +1129,15 @@ SELECT cast('1' as binary) - cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) - CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) - CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) - CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -978,7 +1146,15 @@ SELECT cast('1' as binary) - cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) - CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) - CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) - CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -987,7 +1163,15 @@ SELECT cast('1' as binary) - cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) - CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) - CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) - CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -996,7 +1180,15 @@ SELECT cast('1' as binary) - cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) - CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) - CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) - CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -1333,7 +1525,15 @@ SELECT cast(1 as decimal(3, 0))  - cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) - CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) - CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) - CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -1342,7 +1542,15 @@ SELECT cast(1 as decimal(5, 0))  - cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) - CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) - CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) - CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -1351,7 +1559,15 @@ SELECT cast(1 as decimal(10, 0)) - cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) - CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) - CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) - CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -1360,7 +1576,15 @@ SELECT cast(1 as decimal(20, 0)) - cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) - CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) - CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) - CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -1369,7 +1593,15 @@ SELECT cast(1 as decimal(3, 0))  - cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) - CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) - CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) - CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -1378,7 +1610,15 @@ SELECT cast(1 as decimal(5, 0))  - cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) - CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) - CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) - CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -1387,7 +1627,15 @@ SELECT cast(1 as decimal(10, 0)) - cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) - CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) - CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) - CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -1396,7 +1644,15 @@ SELECT cast(1 as decimal(20, 0)) - cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) - CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) - CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) - CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -1701,7 +1957,15 @@ SELECT cast('1' as binary) * cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) * CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) * CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) * CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -1710,7 +1974,15 @@ SELECT cast('1' as binary) * cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) * CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) * CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) * CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -1719,7 +1991,15 @@ SELECT cast('1' as binary) * cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) * CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) * CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) * CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -1728,7 +2008,15 @@ SELECT cast('1' as binary) * cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) * CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) * CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) * CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -1737,7 +2025,15 @@ SELECT cast('2017*12*11 09:30:00.0' as timestamp) * cast(1 as decimal(3, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017*12*11 09:30:00.0' AS TIMESTAMP) * CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017*12*11 09:30:00.0' AS TIMESTAMP) * CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017*12*11 09:30:00.0 AS TIMESTAMP) * CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -1746,7 +2042,15 @@ SELECT cast('2017*12*11 09:30:00.0' as timestamp) * cast(1 as decimal(5, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017*12*11 09:30:00.0' AS TIMESTAMP) * CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017*12*11 09:30:00.0' AS TIMESTAMP) * CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017*12*11 09:30:00.0 AS TIMESTAMP) * CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -1755,7 +2059,15 @@ SELECT cast('2017*12*11 09:30:00.0' as timestamp) * cast(1 as decimal(10, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017*12*11 09:30:00.0' AS TIMESTAMP) * CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017*12*11 09:30:00.0' AS TIMESTAMP) * CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017*12*11 09:30:00.0 AS TIMESTAMP) * CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -1764,7 +2076,15 @@ SELECT cast('2017*12*11 09:30:00.0' as timestamp) * cast(1 as decimal(20, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017*12*11 09:30:00.0' AS TIMESTAMP) * CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017*12*11 09:30:00.0' AS TIMESTAMP) * CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017*12*11 09:30:00.0 AS TIMESTAMP) * CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -1773,7 +2093,15 @@ SELECT cast('2017*12*11 09:30:00' as date) * cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017*12*11 09:30:00' AS DATE) * CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017*12*11 09:30:00' AS DATE) * CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017*12*11 09:30:00 AS DATE) * CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -1782,7 +2110,15 @@ SELECT cast('2017*12*11 09:30:00' as date) * cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017*12*11 09:30:00' AS DATE) * CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017*12*11 09:30:00' AS DATE) * CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017*12*11 09:30:00 AS DATE) * CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -1791,7 +2127,15 @@ SELECT cast('2017*12*11 09:30:00' as date) * cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017*12*11 09:30:00' AS DATE) * CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017*12*11 09:30:00' AS DATE) * CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017*12*11 09:30:00 AS DATE) * CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -1800,7 +2144,15 @@ SELECT cast('2017*12*11 09:30:00' as date) * cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017*12*11 09:30:00' AS DATE) * CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017*12*11 09:30:00' AS DATE) * CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017*12*11 09:30:00 AS DATE) * CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -2065,7 +2417,15 @@ SELECT cast(1 as decimal(3, 0))  * cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) * CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) * CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) * CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -2074,7 +2434,15 @@ SELECT cast(1 as decimal(5, 0))  * cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) * CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) * CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) * CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -2083,7 +2451,15 @@ SELECT cast(1 as decimal(10, 0)) * cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) * CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) * CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) * CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -2092,7 +2468,15 @@ SELECT cast(1 as decimal(20, 0)) * cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) * CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) * CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) * CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -2101,7 +2485,15 @@ SELECT cast(1 as decimal(3, 0))  * cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) * CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) * CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) * CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -2110,7 +2502,15 @@ SELECT cast(1 as decimal(5, 0))  * cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) * CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) * CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) * CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -2119,7 +2519,15 @@ SELECT cast(1 as decimal(10, 0)) * cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) * CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) * CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) * CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -2128,7 +2536,15 @@ SELECT cast(1 as decimal(20, 0)) * cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) * CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) * CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) * CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -2137,7 +2553,15 @@ SELECT cast(1 as decimal(3, 0))  * cast('2017*12*11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) * CAST('2017*12*11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) * CAST('2017*12*11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) * CAST(2017*12*11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -2146,7 +2570,15 @@ SELECT cast(1 as decimal(5, 0))  * cast('2017*12*11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) * CAST('2017*12*11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) * CAST('2017*12*11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) * CAST(2017*12*11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -2155,7 +2587,15 @@ SELECT cast(1 as decimal(10, 0)) * cast('2017*12*11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) * CAST('2017*12*11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) * CAST('2017*12*11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) * CAST(2017*12*11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -2164,7 +2604,15 @@ SELECT cast(1 as decimal(20, 0)) * cast('2017*12*11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) * CAST('2017*12*11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) * CAST('2017*12*11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) * CAST(2017*12*11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -2173,7 +2621,15 @@ SELECT cast(1 as decimal(3, 0))  * cast('2017*12*11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) * CAST('2017*12*11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) * CAST('2017*12*11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) * CAST(2017*12*11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -2182,7 +2638,15 @@ SELECT cast(1 as decimal(5, 0))  * cast('2017*12*11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) * CAST('2017*12*11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) * CAST('2017*12*11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) * CAST(2017*12*11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -2191,7 +2655,15 @@ SELECT cast(1 as decimal(10, 0)) * cast('2017*12*11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) * CAST('2017*12*11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) * CAST('2017*12*11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) * CAST(2017*12*11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -2200,7 +2672,15 @@ SELECT cast(1 as decimal(20, 0)) * cast('2017*12*11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) * CAST('2017*12*11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) * CAST('2017*12*11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) * CAST(2017*12*11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -2433,7 +2913,15 @@ SELECT cast('1' as binary) / cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -2442,7 +2930,15 @@ SELECT cast('1' as binary) / cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -2451,7 +2947,15 @@ SELECT cast('1' as binary) / cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -2460,7 +2964,15 @@ SELECT cast('1' as binary) / cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -2469,7 +2981,15 @@ SELECT cast('2017/12/11 09:30:00.0' as timestamp) / cast(1 as decimal(3, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017/12/11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017/12/11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017/12/11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -2478,7 +2998,15 @@ SELECT cast('2017/12/11 09:30:00.0' as timestamp) / cast(1 as decimal(5, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017/12/11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017/12/11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017/12/11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -2487,7 +3015,15 @@ SELECT cast('2017/12/11 09:30:00.0' as timestamp) / cast(1 as decimal(10, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017/12/11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017/12/11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017/12/11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -2496,7 +3032,15 @@ SELECT cast('2017/12/11 09:30:00.0' as timestamp) / cast(1 as decimal(20, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017/12/11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017/12/11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017/12/11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -2505,7 +3049,15 @@ SELECT cast('2017/12/11 09:30:00' as date) / cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017/12/11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017/12/11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017/12/11 09:30:00 AS DATE) / CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -2514,7 +3066,15 @@ SELECT cast('2017/12/11 09:30:00' as date) / cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017/12/11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017/12/11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017/12/11 09:30:00 AS DATE) / CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -2523,7 +3083,15 @@ SELECT cast('2017/12/11 09:30:00' as date) / cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017/12/11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017/12/11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017/12/11 09:30:00 AS DATE) / CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -2532,7 +3100,15 @@ SELECT cast('2017/12/11 09:30:00' as date) / cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017/12/11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017/12/11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017/12/11 09:30:00 AS DATE) / CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -2797,7 +3373,15 @@ SELECT cast(1 as decimal(3, 0))  / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) / CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) / CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -2806,7 +3390,15 @@ SELECT cast(1 as decimal(5, 0))  / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) / CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) / CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -2815,7 +3407,15 @@ SELECT cast(1 as decimal(10, 0)) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) / CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) / CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -2824,7 +3424,15 @@ SELECT cast(1 as decimal(20, 0)) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) / CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) / CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -2833,7 +3441,15 @@ SELECT cast(1 as decimal(3, 0))  / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) / CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -2842,7 +3458,15 @@ SELECT cast(1 as decimal(5, 0))  / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) / CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -2851,7 +3475,15 @@ SELECT cast(1 as decimal(10, 0)) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) / CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -2860,7 +3492,15 @@ SELECT cast(1 as decimal(20, 0)) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) / CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -2869,7 +3509,15 @@ SELECT cast(1 as decimal(3, 0))  / cast('2017/12/11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) / CAST('2017/12/11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) / CAST('2017/12/11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) / CAST(2017/12/11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -2878,7 +3526,15 @@ SELECT cast(1 as decimal(5, 0))  / cast('2017/12/11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) / CAST('2017/12/11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) / CAST('2017/12/11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) / CAST(2017/12/11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -2887,7 +3543,15 @@ SELECT cast(1 as decimal(10, 0)) / cast('2017/12/11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) / CAST('2017/12/11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) / CAST('2017/12/11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) / CAST(2017/12/11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -2896,7 +3560,15 @@ SELECT cast(1 as decimal(20, 0)) / cast('2017/12/11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) / CAST('2017/12/11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) / CAST('2017/12/11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) / CAST(2017/12/11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -2905,7 +3577,15 @@ SELECT cast(1 as decimal(3, 0))  / cast('2017/12/11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) / CAST('2017/12/11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) / CAST('2017/12/11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) / CAST(2017/12/11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -2914,7 +3594,15 @@ SELECT cast(1 as decimal(5, 0))  / cast('2017/12/11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) / CAST('2017/12/11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) / CAST('2017/12/11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) / CAST(2017/12/11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -2923,7 +3611,15 @@ SELECT cast(1 as decimal(10, 0)) / cast('2017/12/11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) / CAST('2017/12/11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) / CAST('2017/12/11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) / CAST(2017/12/11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -2932,7 +3628,15 @@ SELECT cast(1 as decimal(20, 0)) / cast('2017/12/11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) / CAST('2017/12/11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) / CAST('2017/12/11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) / CAST(2017/12/11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -3165,7 +3869,15 @@ SELECT cast('1' as binary) % cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) % CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) % CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) % CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -3174,7 +3886,15 @@ SELECT cast('1' as binary) % cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) % CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) % CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) % CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -3183,7 +3903,15 @@ SELECT cast('1' as binary) % cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) % CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) % CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) % CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -3192,7 +3920,15 @@ SELECT cast('1' as binary) % cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) % CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) % CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) % CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -3201,7 +3937,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) % cast(1 as decimal(3, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) % CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -3210,7 +3954,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) % cast(1 as decimal(5, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) % CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -3219,7 +3971,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) % cast(1 as decimal(10, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) % CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -3228,7 +3988,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) % cast(1 as decimal(20, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) % CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -3237,7 +4005,15 @@ SELECT cast('2017-12-11 09:30:00' as date) % cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) % CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) % CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) % CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -3246,7 +4022,15 @@ SELECT cast('2017-12-11 09:30:00' as date) % cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) % CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) % CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) % CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -3255,7 +4039,15 @@ SELECT cast('2017-12-11 09:30:00' as date) % cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) % CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) % CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) % CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -3264,7 +4056,15 @@ SELECT cast('2017-12-11 09:30:00' as date) % cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) % CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) % CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) % CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -3529,7 +4329,15 @@ SELECT cast(1 as decimal(3, 0))  % cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) % CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) % CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) % CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -3538,7 +4346,15 @@ SELECT cast(1 as decimal(5, 0))  % cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) % CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) % CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) % CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -3547,7 +4363,15 @@ SELECT cast(1 as decimal(10, 0)) % cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) % CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) % CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) % CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -3556,7 +4380,15 @@ SELECT cast(1 as decimal(20, 0)) % cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) % CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) % CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) % CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -3565,7 +4397,15 @@ SELECT cast(1 as decimal(3, 0))  % cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) % CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) % CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) % CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -3574,7 +4414,15 @@ SELECT cast(1 as decimal(5, 0))  % cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) % CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) % CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) % CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -3583,7 +4431,15 @@ SELECT cast(1 as decimal(10, 0)) % cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) % CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) % CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) % CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -3592,7 +4448,15 @@ SELECT cast(1 as decimal(20, 0)) % cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) % CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) % CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) % CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -3601,7 +4465,15 @@ SELECT cast(1 as decimal(3, 0))  % cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) % CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -3610,7 +4482,15 @@ SELECT cast(1 as decimal(5, 0))  % cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) % CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -3619,7 +4499,15 @@ SELECT cast(1 as decimal(10, 0)) % cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) % CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -3628,7 +4516,15 @@ SELECT cast(1 as decimal(20, 0)) % cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) % CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -3637,7 +4533,15 @@ SELECT cast(1 as decimal(3, 0))  % cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) % CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) % CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) % CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -3646,7 +4550,15 @@ SELECT cast(1 as decimal(5, 0))  % cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) % CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) % CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) % CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -3655,7 +4567,15 @@ SELECT cast(1 as decimal(10, 0)) % cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) % CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) % CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) % CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -3664,7 +4584,15 @@ SELECT cast(1 as decimal(20, 0)) % cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) % CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) % CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) % CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -3897,7 +4825,15 @@ SELECT pmod(cast('1' as binary), cast(1 as decimal(3, 0))) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS BINARY), CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in 'pmod(CAST('1' AS BINARY), CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS BINARY), CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -3906,7 +4842,15 @@ SELECT pmod(cast('1' as binary), cast(1 as decimal(5, 0))) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS BINARY), CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in 'pmod(CAST('1' AS BINARY), CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS BINARY), CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -3915,7 +4859,15 @@ SELECT pmod(cast('1' as binary), cast(1 as decimal(10, 0))) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS BINARY), CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in 'pmod(CAST('1' AS BINARY), CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS BINARY), CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -3924,7 +4876,15 @@ SELECT pmod(cast('1' as binary), cast(1 as decimal(20, 0))) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS BINARY), CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in 'pmod(CAST('1' AS BINARY), CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS BINARY), CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -3933,7 +4893,15 @@ SELECT pmod(cast('2017-12-11 09:30:00.0' as timestamp), cast(1 as decimal(3, 0))
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP), CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -3942,7 +4910,15 @@ SELECT pmod(cast('2017-12-11 09:30:00.0' as timestamp), cast(1 as decimal(5, 0))
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP), CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -3951,7 +4927,15 @@ SELECT pmod(cast('2017-12-11 09:30:00.0' as timestamp), cast(1 as decimal(10, 0)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP), CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -3960,7 +4944,15 @@ SELECT pmod(cast('2017-12-11 09:30:00.0' as timestamp), cast(1 as decimal(20, 0)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP), CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -3969,7 +4961,15 @@ SELECT pmod(cast('2017-12-11 09:30:00' as date), cast(1 as decimal(3, 0))) FROM
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00 AS DATE), CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -3978,7 +4978,15 @@ SELECT pmod(cast('2017-12-11 09:30:00' as date), cast(1 as decimal(5, 0))) FROM
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00 AS DATE), CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -3987,7 +4995,15 @@ SELECT pmod(cast('2017-12-11 09:30:00' as date), cast(1 as decimal(10, 0))) FROM
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00 AS DATE), CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -3996,7 +5012,15 @@ SELECT pmod(cast('2017-12-11 09:30:00' as date), cast(1 as decimal(20, 0))) FROM
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00 AS DATE), CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -4261,7 +5285,15 @@ SELECT pmod(cast(1 as decimal(3, 0)) , cast('1' as binary)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(3,0)), CAST('1' AS BINARY))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(3,0)), CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(3,0)), CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -4270,7 +5302,15 @@ SELECT pmod(cast(1 as decimal(5, 0)) , cast('1' as binary)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(5,0)), CAST('1' AS BINARY))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(5,0)), CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(5,0)), CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -4279,7 +5319,15 @@ SELECT pmod(cast(1 as decimal(10, 0)), cast('1' as binary)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(10,0)), CAST('1' AS BINARY))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(10,0)), CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(10,0)), CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -4288,7 +5336,15 @@ SELECT pmod(cast(1 as decimal(20, 0)), cast('1' as binary)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(20,0)), CAST('1' AS BINARY))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(20,0)), CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(20,0)), CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -4297,7 +5353,15 @@ SELECT pmod(cast(1 as decimal(3, 0)) , cast(1 as boolean)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(3,0)), CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(3,0)), CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(3,0)), CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -4306,7 +5370,15 @@ SELECT pmod(cast(1 as decimal(5, 0)) , cast(1 as boolean)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(5,0)), CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(5,0)), CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(5,0)), CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -4315,7 +5387,15 @@ SELECT pmod(cast(1 as decimal(10, 0)), cast(1 as boolean)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(10,0)), CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(10,0)), CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(10,0)), CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -4324,7 +5404,15 @@ SELECT pmod(cast(1 as decimal(20, 0)), cast(1 as boolean)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(20,0)), CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(20,0)), CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(20,0)), CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -4333,7 +5421,15 @@ SELECT pmod(cast(1 as decimal(3, 0)) , cast('2017-12-11 09:30:00.0' as timestamp
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(3,0)), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(3,0)), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(3,0)), CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -4342,7 +5438,15 @@ SELECT pmod(cast(1 as decimal(5, 0)) , cast('2017-12-11 09:30:00.0' as timestamp
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(5,0)), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(5,0)), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(5,0)), CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -4351,7 +5455,15 @@ SELECT pmod(cast(1 as decimal(10, 0)), cast('2017-12-11 09:30:00.0' as timestamp
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(10,0)), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(10,0)), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(10,0)), CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -4360,7 +5472,15 @@ SELECT pmod(cast(1 as decimal(20, 0)), cast('2017-12-11 09:30:00.0' as timestamp
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(20,0)), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(20,0)), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(20,0)), CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -4369,7 +5489,15 @@ SELECT pmod(cast(1 as decimal(3, 0)) , cast('2017-12-11 09:30:00' as date)) FROM
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(3,0)), CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(3,0)), CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(3,0)), CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -4378,7 +5506,15 @@ SELECT pmod(cast(1 as decimal(5, 0)) , cast('2017-12-11 09:30:00' as date)) FROM
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(5,0)), CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(5,0)), CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(5,0)), CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -4387,7 +5523,15 @@ SELECT pmod(cast(1 as decimal(10, 0)), cast('2017-12-11 09:30:00' as date)) FROM
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(10,0)), CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(10,0)), CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(10,0)), CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -4396,7 +5540,15 @@ SELECT pmod(cast(1 as decimal(20, 0)), cast('2017-12-11 09:30:00' as date)) FROM
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS DECIMAL(20,0)), CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in 'pmod(CAST(1 AS DECIMAL(20,0)), CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS DECIMAL(20,0)), CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -4629,7 +5781,15 @@ SELECT cast('1' as binary) = cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -4638,7 +5798,15 @@ SELECT cast('1' as binary) = cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -4647,7 +5815,15 @@ SELECT cast('1' as binary) = cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -4656,7 +5832,15 @@ SELECT cast('1' as binary) = cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -4665,7 +5849,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) = cast(1 as decimal(3, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -4674,7 +5866,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) = cast(1 as decimal(5, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -4683,7 +5883,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) = cast(1 as decimal(10, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -4692,7 +5900,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) = cast(1 as decimal(20, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -4701,7 +5917,15 @@ SELECT cast('2017-12-11 09:30:00' as date) = cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -4710,7 +5934,15 @@ SELECT cast('2017-12-11 09:30:00' as date) = cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -4719,7 +5951,15 @@ SELECT cast('2017-12-11 09:30:00' as date) = cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -4728,7 +5968,15 @@ SELECT cast('2017-12-11 09:30:00' as date) = cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -4993,7 +6241,15 @@ SELECT cast(1 as decimal(3, 0))  = cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) = CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) = CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -5002,7 +6258,15 @@ SELECT cast(1 as decimal(5, 0))  = cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) = CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) = CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -5011,7 +6275,15 @@ SELECT cast(1 as decimal(10, 0)) = cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) = CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) = CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -5020,7 +6292,15 @@ SELECT cast(1 as decimal(20, 0)) = cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) = CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) = CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -5061,7 +6341,15 @@ SELECT cast(1 as decimal(3, 0))  = cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -5070,7 +6358,15 @@ SELECT cast(1 as decimal(5, 0))  = cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -5079,7 +6375,15 @@ SELECT cast(1 as decimal(10, 0)) = cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -5088,7 +6392,15 @@ SELECT cast(1 as decimal(20, 0)) = cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -5097,7 +6409,15 @@ SELECT cast(1 as decimal(3, 0))  = cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) = CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -5106,7 +6426,15 @@ SELECT cast(1 as decimal(5, 0))  = cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) = CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -5115,7 +6443,15 @@ SELECT cast(1 as decimal(10, 0)) = cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) = CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -5124,7 +6460,15 @@ SELECT cast(1 as decimal(20, 0)) = cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) = CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -5357,7 +6701,15 @@ SELECT cast('1' as binary) <=> cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <=> CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <=> CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <=> CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -5366,7 +6718,15 @@ SELECT cast('1' as binary) <=> cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <=> CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <=> CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <=> CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -5375,7 +6735,15 @@ SELECT cast('1' as binary) <=> cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <=> CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <=> CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <=> CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -5384,7 +6752,15 @@ SELECT cast('1' as binary) <=> cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <=> CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <=> CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <=> CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -5393,7 +6769,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <=> cast(1 as decimal(3, 0)) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <=> CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -5402,7 +6786,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <=> cast(1 as decimal(5, 0)) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <=> CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -5411,7 +6803,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <=> cast(1 as decimal(10, 0))
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <=> CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -5420,7 +6820,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <=> cast(1 as decimal(20, 0))
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <=> CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <=> CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -5429,7 +6837,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <=> cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <=> CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <=> CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <=> CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -5438,7 +6854,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <=> cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <=> CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <=> CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <=> CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -5447,7 +6871,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <=> cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <=> CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <=> CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <=> CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -5456,7 +6888,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <=> cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <=> CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <=> CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <=> CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -5721,7 +7161,15 @@ SELECT cast(1 as decimal(3, 0))  <=> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) <=> CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) <=> CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) <=> CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -5730,7 +7178,15 @@ SELECT cast(1 as decimal(5, 0))  <=> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) <=> CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) <=> CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) <=> CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -5739,7 +7195,15 @@ SELECT cast(1 as decimal(10, 0)) <=> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) <=> CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) <=> CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) <=> CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -5748,7 +7212,15 @@ SELECT cast(1 as decimal(20, 0)) <=> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) <=> CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) <=> CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) <=> CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -5789,7 +7261,15 @@ SELECT cast(1 as decimal(3, 0))  <=> cast('2017-12-11 09:30:00.0' as timestamp)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) <=> CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -5798,7 +7278,15 @@ SELECT cast(1 as decimal(5, 0))  <=> cast('2017-12-11 09:30:00.0' as timestamp)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) <=> CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -5807,7 +7295,15 @@ SELECT cast(1 as decimal(10, 0)) <=> cast('2017-12-11 09:30:00.0' as timestamp)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) <=> CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -5816,7 +7312,15 @@ SELECT cast(1 as decimal(20, 0)) <=> cast('2017-12-11 09:30:00.0' as timestamp)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) <=> CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) <=> CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -5825,7 +7329,15 @@ SELECT cast(1 as decimal(3, 0))  <=> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) <=> CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) <=> CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) <=> CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -5834,7 +7346,15 @@ SELECT cast(1 as decimal(5, 0))  <=> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) <=> CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) <=> CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) <=> CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -5843,7 +7363,15 @@ SELECT cast(1 as decimal(10, 0)) <=> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) <=> CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) <=> CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) <=> CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -5852,7 +7380,15 @@ SELECT cast(1 as decimal(20, 0)) <=> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) <=> CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) <=> CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) <=> CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -6085,7 +7621,15 @@ SELECT cast('1' as binary) < cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) < CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) < CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) < CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -6094,7 +7638,15 @@ SELECT cast('1' as binary) < cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) < CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) < CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) < CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -6103,7 +7655,15 @@ SELECT cast('1' as binary) < cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) < CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) < CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) < CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -6112,7 +7672,15 @@ SELECT cast('1' as binary) < cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) < CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) < CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) < CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -6121,7 +7689,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) < cast(1 as decimal(3, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) < CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) < CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) < CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -6130,7 +7706,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) < cast(1 as decimal(5, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) < CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) < CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) < CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -6139,7 +7723,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) < cast(1 as decimal(10, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) < CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) < CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) < CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -6148,7 +7740,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) < cast(1 as decimal(20, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) < CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) < CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) < CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -6157,7 +7757,15 @@ SELECT cast('2017-12-11 09:30:00' as date) < cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) < CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) < CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) < CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -6166,7 +7774,15 @@ SELECT cast('2017-12-11 09:30:00' as date) < cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) < CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) < CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) < CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -6175,7 +7791,15 @@ SELECT cast('2017-12-11 09:30:00' as date) < cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) < CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) < CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) < CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -6184,7 +7808,15 @@ SELECT cast('2017-12-11 09:30:00' as date) < cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) < CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) < CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) < CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -6449,7 +8081,15 @@ SELECT cast(1 as decimal(3, 0))  < cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) < CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) < CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) < CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -6458,7 +8098,15 @@ SELECT cast(1 as decimal(5, 0))  < cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) < CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) < CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) < CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -6467,7 +8115,15 @@ SELECT cast(1 as decimal(10, 0)) < cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) < CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) < CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) < CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -6476,7 +8132,15 @@ SELECT cast(1 as decimal(20, 0)) < cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) < CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) < CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) < CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -6485,7 +8149,15 @@ SELECT cast(1 as decimal(3, 0))  < cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) < CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) < CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) < CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -6494,7 +8166,15 @@ SELECT cast(1 as decimal(5, 0))  < cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) < CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) < CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) < CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -6503,7 +8183,15 @@ SELECT cast(1 as decimal(10, 0)) < cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) < CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) < CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) < CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -6512,7 +8200,15 @@ SELECT cast(1 as decimal(20, 0)) < cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) < CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) < CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) < CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -6521,7 +8217,15 @@ SELECT cast(1 as decimal(3, 0))  < cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) < CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) < CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) < CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -6530,7 +8234,15 @@ SELECT cast(1 as decimal(5, 0))  < cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) < CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) < CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) < CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -6539,7 +8251,15 @@ SELECT cast(1 as decimal(10, 0)) < cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) < CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) < CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) < CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -6548,7 +8268,15 @@ SELECT cast(1 as decimal(20, 0)) < cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) < CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) < CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) < CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -6557,7 +8285,15 @@ SELECT cast(1 as decimal(3, 0))  < cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) < CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) < CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) < CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -6566,7 +8302,15 @@ SELECT cast(1 as decimal(5, 0))  < cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) < CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) < CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) < CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -6575,7 +8319,15 @@ SELECT cast(1 as decimal(10, 0)) < cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) < CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) < CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) < CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -6584,7 +8336,15 @@ SELECT cast(1 as decimal(20, 0)) < cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) < CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) < CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) < CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -6817,7 +8577,15 @@ SELECT cast('1' as binary) <= cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <= CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <= CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <= CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -6826,7 +8594,15 @@ SELECT cast('1' as binary) <= cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <= CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <= CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <= CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -6835,7 +8611,15 @@ SELECT cast('1' as binary) <= cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <= CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <= CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <= CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -6844,7 +8628,15 @@ SELECT cast('1' as binary) <= cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) <= CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) <= CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) <= CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -6853,7 +8645,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <= cast(1 as decimal(3, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <= CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <= CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <= CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -6862,7 +8662,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <= cast(1 as decimal(5, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <= CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <= CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <= CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -6871,7 +8679,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <= cast(1 as decimal(10, 0)) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <= CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <= CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <= CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -6880,7 +8696,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <= cast(1 as decimal(20, 0)) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <= CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) <= CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) <= CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -6889,7 +8713,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <= cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <= CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <= CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <= CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -6898,7 +8730,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <= cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <= CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <= CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <= CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -6907,7 +8747,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <= cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <= CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <= CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <= CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -6916,7 +8764,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <= cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) <= CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) <= CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) <= CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -7181,7 +9037,15 @@ SELECT cast(1 as decimal(3, 0))  <= cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) <= CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) <= CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) <= CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -7190,7 +9054,15 @@ SELECT cast(1 as decimal(5, 0))  <= cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) <= CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) <= CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) <= CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -7199,7 +9071,15 @@ SELECT cast(1 as decimal(10, 0)) <= cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) <= CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) <= CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) <= CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -7208,7 +9088,15 @@ SELECT cast(1 as decimal(20, 0)) <= cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) <= CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) <= CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) <= CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -7217,7 +9105,15 @@ SELECT cast(1 as decimal(3, 0))  <= cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) <= CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) <= CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) <= CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -7226,7 +9122,15 @@ SELECT cast(1 as decimal(5, 0))  <= cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) <= CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) <= CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) <= CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -7235,7 +9139,15 @@ SELECT cast(1 as decimal(10, 0)) <= cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) <= CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) <= CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) <= CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -7244,7 +9156,15 @@ SELECT cast(1 as decimal(20, 0)) <= cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) <= CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) <= CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) <= CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -7253,7 +9173,15 @@ SELECT cast(1 as decimal(3, 0))  <= cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) <= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) <= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) <= CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -7262,7 +9190,15 @@ SELECT cast(1 as decimal(5, 0))  <= cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) <= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) <= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) <= CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -7271,7 +9207,15 @@ SELECT cast(1 as decimal(10, 0)) <= cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) <= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) <= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) <= CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -7280,7 +9224,15 @@ SELECT cast(1 as decimal(20, 0)) <= cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) <= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) <= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) <= CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -7289,7 +9241,15 @@ SELECT cast(1 as decimal(3, 0))  <= cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) <= CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) <= CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) <= CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -7298,7 +9258,15 @@ SELECT cast(1 as decimal(5, 0))  <= cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) <= CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) <= CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) <= CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -7307,7 +9275,15 @@ SELECT cast(1 as decimal(10, 0)) <= cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) <= CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) <= CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) <= CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -7316,7 +9292,15 @@ SELECT cast(1 as decimal(20, 0)) <= cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) <= CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) <= CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) <= CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -7549,7 +9533,15 @@ SELECT cast('1' as binary) > cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) > CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) > CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) > CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -7558,7 +9550,15 @@ SELECT cast('1' as binary) > cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) > CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) > CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) > CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -7567,7 +9567,15 @@ SELECT cast('1' as binary) > cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) > CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) > CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) > CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -7576,7 +9584,15 @@ SELECT cast('1' as binary) > cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) > CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) > CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) > CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -7585,7 +9601,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) > cast(1 as decimal(3, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) > CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) > CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) > CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -7594,7 +9618,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) > cast(1 as decimal(5, 0)) FRO
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) > CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) > CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) > CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -7603,7 +9635,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) > cast(1 as decimal(10, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) > CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) > CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) > CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -7612,7 +9652,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) > cast(1 as decimal(20, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) > CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) > CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) > CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -7621,7 +9669,15 @@ SELECT cast('2017-12-11 09:30:00' as date) > cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) > CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) > CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) > CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -7630,7 +9686,15 @@ SELECT cast('2017-12-11 09:30:00' as date) > cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) > CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) > CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) > CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -7639,7 +9703,15 @@ SELECT cast('2017-12-11 09:30:00' as date) > cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) > CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) > CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) > CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -7648,7 +9720,15 @@ SELECT cast('2017-12-11 09:30:00' as date) > cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) > CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) > CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) > CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -7913,7 +9993,15 @@ SELECT cast(1 as decimal(3, 0))  > cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) > CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) > CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) > CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -7922,7 +10010,15 @@ SELECT cast(1 as decimal(5, 0))  > cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) > CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) > CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) > CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -7931,7 +10027,15 @@ SELECT cast(1 as decimal(10, 0)) > cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) > CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) > CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) > CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -7940,7 +10044,15 @@ SELECT cast(1 as decimal(20, 0)) > cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) > CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) > CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) > CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -7949,7 +10061,15 @@ SELECT cast(1 as decimal(3, 0))  > cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) > CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) > CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) > CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -7958,7 +10078,15 @@ SELECT cast(1 as decimal(5, 0))  > cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) > CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) > CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) > CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -7967,7 +10095,15 @@ SELECT cast(1 as decimal(10, 0)) > cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) > CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) > CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) > CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -7976,7 +10112,15 @@ SELECT cast(1 as decimal(20, 0)) > cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) > CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) > CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) > CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -7985,7 +10129,15 @@ SELECT cast(1 as decimal(3, 0))  > cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) > CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) > CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) > CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -7994,7 +10146,15 @@ SELECT cast(1 as decimal(5, 0))  > cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) > CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) > CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) > CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -8003,7 +10163,15 @@ SELECT cast(1 as decimal(10, 0)) > cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) > CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) > CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) > CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -8012,7 +10180,15 @@ SELECT cast(1 as decimal(20, 0)) > cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) > CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) > CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) > CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -8021,7 +10197,15 @@ SELECT cast(1 as decimal(3, 0))  > cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) > CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) > CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) > CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -8030,7 +10214,15 @@ SELECT cast(1 as decimal(5, 0))  > cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) > CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) > CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) > CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -8039,7 +10231,15 @@ SELECT cast(1 as decimal(10, 0)) > cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) > CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) > CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) > CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -8048,7 +10248,15 @@ SELECT cast(1 as decimal(20, 0)) > cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) > CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) > CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) > CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -8281,7 +10489,15 @@ SELECT cast('1' as binary) >= cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) >= CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) >= CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) >= CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -8290,7 +10506,15 @@ SELECT cast('1' as binary) >= cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) >= CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) >= CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) >= CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -8299,7 +10523,15 @@ SELECT cast('1' as binary) >= cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) >= CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) >= CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) >= CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -8308,7 +10540,15 @@ SELECT cast('1' as binary) >= cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) >= CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) >= CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) >= CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -8317,7 +10557,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) >= cast(1 as decimal(3, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) >= CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) >= CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) >= CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -8326,7 +10574,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) >= cast(1 as decimal(5, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) >= CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) >= CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) >= CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -8335,7 +10591,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) >= cast(1 as decimal(10, 0)) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) >= CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) >= CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) >= CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -8344,7 +10608,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) >= cast(1 as decimal(20, 0)) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) >= CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) >= CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) >= CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -8353,7 +10625,15 @@ SELECT cast('2017-12-11 09:30:00' as date) >= cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) >= CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) >= CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) >= CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -8362,7 +10642,15 @@ SELECT cast('2017-12-11 09:30:00' as date) >= cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) >= CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) >= CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) >= CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -8371,7 +10659,15 @@ SELECT cast('2017-12-11 09:30:00' as date) >= cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) >= CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) >= CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) >= CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -8380,7 +10676,15 @@ SELECT cast('2017-12-11 09:30:00' as date) >= cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) >= CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) >= CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) >= CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -8645,7 +10949,15 @@ SELECT cast(1 as decimal(3, 0))  >= cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) >= CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) >= CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) >= CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -8654,7 +10966,15 @@ SELECT cast(1 as decimal(5, 0))  >= cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) >= CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) >= CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) >= CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -8663,7 +10983,15 @@ SELECT cast(1 as decimal(10, 0)) >= cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) >= CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) >= CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) >= CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -8672,7 +11000,15 @@ SELECT cast(1 as decimal(20, 0)) >= cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) >= CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) >= CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) >= CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -8681,7 +11017,15 @@ SELECT cast(1 as decimal(3, 0))  >= cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) >= CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) >= CAST(1 AS BOOLEAN))' (decimal(3,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) >= CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -8690,7 +11034,15 @@ SELECT cast(1 as decimal(5, 0))  >= cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) >= CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) >= CAST(1 AS BOOLEAN))' (decimal(5,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) >= CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -8699,7 +11051,15 @@ SELECT cast(1 as decimal(10, 0)) >= cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) >= CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) >= CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) >= CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -8708,7 +11068,15 @@ SELECT cast(1 as decimal(20, 0)) >= cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) >= CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) >= CAST(1 AS BOOLEAN))' (decimal(20,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) >= CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -8717,7 +11085,15 @@ SELECT cast(1 as decimal(3, 0))  >= cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) >= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) >= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) >= CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -8726,7 +11102,15 @@ SELECT cast(1 as decimal(5, 0))  >= cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) >= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) >= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) >= CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -8735,7 +11119,15 @@ SELECT cast(1 as decimal(10, 0)) >= cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) >= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) >= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) >= CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -8744,7 +11136,15 @@ SELECT cast(1 as decimal(20, 0)) >= cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) >= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) >= CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) >= CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -8753,7 +11153,15 @@ SELECT cast(1 as decimal(3, 0))  >= cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) >= CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) >= CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) >= CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -8762,7 +11170,15 @@ SELECT cast(1 as decimal(5, 0))  >= cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) >= CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) >= CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) >= CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -8771,7 +11187,15 @@ SELECT cast(1 as decimal(10, 0)) >= cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) >= CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) >= CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) >= CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -8780,7 +11204,15 @@ SELECT cast(1 as decimal(20, 0)) >= cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) >= CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) >= CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) >= CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -9013,7 +11445,15 @@ SELECT cast('1' as binary) <> cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(3,0)))' (binary and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -9022,7 +11462,15 @@ SELECT cast('1' as binary) <> cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(5,0)))' (binary and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -9031,7 +11479,15 @@ SELECT cast('1' as binary) <> cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -9040,7 +11496,15 @@ SELECT cast('1' as binary) <> cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) = CAST(1 AS DECIMAL(20,0)))' (binary and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) = CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -9049,7 +11513,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <> cast(1 as decimal(3, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(3,0)))' (timestamp and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -9058,7 +11530,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <> cast(1 as decimal(5, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(5,0)))' (timestamp and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -9067,7 +11547,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <> cast(1 as decimal(10, 0)) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -9076,7 +11564,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) <> cast(1 as decimal(20, 0)) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) = CAST(1 AS DECIMAL(20,0)))' (timestamp and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) = CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -9085,7 +11581,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <> cast(1 as decimal(3, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(3,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(3,0)))' (date and decimal(3,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = CAST(1 AS DECIMAL(3,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(3,0)\""
+  }
+}
 
 
 -- !query
@@ -9094,7 +11598,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <> cast(1 as decimal(5, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(5,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(5,0)))' (date and decimal(5,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = CAST(1 AS DECIMAL(5,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(5,0)\""
+  }
+}
 
 
 -- !query
@@ -9103,7 +11615,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <> cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -9112,7 +11632,15 @@ SELECT cast('2017-12-11 09:30:00' as date) <> cast(1 as decimal(20, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(20,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) = CAST(1 AS DECIMAL(20,0)))' (date and decimal(20,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) = CAST(1 AS DECIMAL(20,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(20,0)\""
+  }
+}
 
 
 -- !query
@@ -9377,7 +11905,15 @@ SELECT cast(1 as decimal(3, 0))  <> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) = CAST('1' AS BINARY))' (decimal(3,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) = CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -9386,7 +11922,15 @@ SELECT cast(1 as decimal(5, 0))  <> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) = CAST('1' AS BINARY))' (decimal(5,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) = CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -9395,7 +11939,15 @@ SELECT cast(1 as decimal(10, 0)) <> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) = CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) = CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -9404,7 +11956,15 @@ SELECT cast(1 as decimal(20, 0)) <> cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) = CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) = CAST('1' AS BINARY))' (decimal(20,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) = CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -9445,7 +12005,15 @@ SELECT cast(1 as decimal(3, 0))  <> cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(3,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -9454,7 +12022,15 @@ SELECT cast(1 as decimal(5, 0))  <> cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(5,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -9463,7 +12039,15 @@ SELECT cast(1 as decimal(10, 0)) <> cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -9472,7 +12056,15 @@ SELECT cast(1 as decimal(20, 0)) <> cast('2017-12-11 09:30:00.0' as timestamp) F
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) = CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(20,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) = CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -9481,7 +12073,15 @@ SELECT cast(1 as decimal(3, 0))  <> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(3,0)) = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(3,0)) = CAST('2017-12-11 09:30:00' AS DATE))' (decimal(3,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(3,0)) = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(3,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -9490,7 +12090,15 @@ SELECT cast(1 as decimal(5, 0))  <> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(5,0)) = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(5,0)) = CAST('2017-12-11 09:30:00' AS DATE))' (decimal(5,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(5,0)) = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(5,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -9499,7 +12107,15 @@ SELECT cast(1 as decimal(10, 0)) <> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) = CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -9508,4 +12124,12 @@ SELECT cast(1 as decimal(20, 0)) <> cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(20,0)) = CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(20,0)) = CAST('2017-12-11 09:30:00' AS DATE))' (decimal(20,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(20,0)) = CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(20,0)\"",
+    "right" : "\"DATE\""
+  }
+}
diff --git a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/division.sql.out b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/division.sql.out
index f08d2255f18..893efa7c578 100644
--- a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/division.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/division.sql.out
@@ -77,7 +77,15 @@ SELECT cast(1 as tinyint) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS TINYINT) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS TINYINT) / CAST('1' AS BINARY))' (tinyint and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS TINYINT) / CAST(1 AS BINARY))\"",
+    "left" : "\"TINYINT\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -86,7 +94,15 @@ SELECT cast(1 as tinyint) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS TINYINT) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS TINYINT) / CAST(1 AS BOOLEAN))' (tinyint and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS TINYINT) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"TINYINT\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -95,7 +111,15 @@ SELECT cast(1 as tinyint) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS TINYINT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS TINYINT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (tinyint and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS TINYINT) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"TINYINT\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -104,7 +128,15 @@ SELECT cast(1 as tinyint) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS TINYINT) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS TINYINT) / CAST('2017-12-11 09:30:00' AS DATE))' (tinyint and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS TINYINT) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"TINYINT\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -177,7 +209,15 @@ SELECT cast(1 as smallint) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS SMALLINT) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS SMALLINT) / CAST('1' AS BINARY))' (smallint and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS SMALLINT) / CAST(1 AS BINARY))\"",
+    "left" : "\"SMALLINT\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -186,7 +226,15 @@ SELECT cast(1 as smallint) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS SMALLINT) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS SMALLINT) / CAST(1 AS BOOLEAN))' (smallint and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS SMALLINT) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"SMALLINT\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -195,7 +243,15 @@ SELECT cast(1 as smallint) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS SMALLINT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS SMALLINT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (smallint and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS SMALLINT) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"SMALLINT\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -204,7 +260,15 @@ SELECT cast(1 as smallint) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS SMALLINT) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS SMALLINT) / CAST('2017-12-11 09:30:00' AS DATE))' (smallint and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS SMALLINT) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"SMALLINT\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -277,7 +341,15 @@ SELECT cast(1 as int) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS INT) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS INT) / CAST('1' AS BINARY))' (int and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS INT) / CAST(1 AS BINARY))\"",
+    "left" : "\"INT\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -286,7 +358,15 @@ SELECT cast(1 as int) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS INT) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS INT) / CAST(1 AS BOOLEAN))' (int and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS INT) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"INT\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -295,7 +375,15 @@ SELECT cast(1 as int) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS INT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS INT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (int and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS INT) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"INT\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -304,7 +392,15 @@ SELECT cast(1 as int) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS INT) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS INT) / CAST('2017-12-11 09:30:00' AS DATE))' (int and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS INT) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"INT\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -377,7 +473,15 @@ SELECT cast(1 as bigint) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BIGINT) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS BIGINT) / CAST('1' AS BINARY))' (bigint and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BIGINT) / CAST(1 AS BINARY))\"",
+    "left" : "\"BIGINT\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -386,7 +490,15 @@ SELECT cast(1 as bigint) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BIGINT) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS BIGINT) / CAST(1 AS BOOLEAN))' (bigint and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BIGINT) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"BIGINT\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -395,7 +507,15 @@ SELECT cast(1 as bigint) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BIGINT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS BIGINT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (bigint and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BIGINT) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"BIGINT\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -404,7 +524,15 @@ SELECT cast(1 as bigint) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BIGINT) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS BIGINT) / CAST('2017-12-11 09:30:00' AS DATE))' (bigint and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BIGINT) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"BIGINT\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -477,7 +605,15 @@ SELECT cast(1 as float) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS FLOAT) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS FLOAT) / CAST('1' AS BINARY))' (float and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS FLOAT) / CAST(1 AS BINARY))\"",
+    "left" : "\"FLOAT\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -486,7 +622,15 @@ SELECT cast(1 as float) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS FLOAT) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS FLOAT) / CAST(1 AS BOOLEAN))' (float and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS FLOAT) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"FLOAT\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -495,7 +639,15 @@ SELECT cast(1 as float) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS FLOAT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS FLOAT) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (float and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS FLOAT) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"FLOAT\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -504,7 +656,15 @@ SELECT cast(1 as float) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS FLOAT) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS FLOAT) / CAST('2017-12-11 09:30:00' AS DATE))' (float and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS FLOAT) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"FLOAT\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -577,7 +737,15 @@ SELECT cast(1 as double) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DOUBLE) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DOUBLE) / CAST('1' AS BINARY))' (double and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DOUBLE) / CAST(1 AS BINARY))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -586,7 +754,15 @@ SELECT cast(1 as double) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DOUBLE) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DOUBLE) / CAST(1 AS BOOLEAN))' (double and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DOUBLE) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -595,7 +771,15 @@ SELECT cast(1 as double) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DOUBLE) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DOUBLE) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DOUBLE) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -604,7 +788,15 @@ SELECT cast(1 as double) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DOUBLE) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DOUBLE) / CAST('2017-12-11 09:30:00' AS DATE))' (double and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DOUBLE) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -677,7 +869,15 @@ SELECT cast(1 as decimal(10, 0)) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) / CAST('1' AS BINARY))' (decimal(10,0) and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) / CAST(1 AS BINARY))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -686,7 +886,15 @@ SELECT cast(1 as decimal(10, 0)) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) / CAST(1 AS BOOLEAN))' (decimal(10,0) and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -695,7 +903,15 @@ SELECT cast(1 as decimal(10, 0)) / cast('2017-12-11 09:30:00.0' as timestamp) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (decimal(10,0) and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -704,7 +920,15 @@ SELECT cast(1 as decimal(10, 0)) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS DECIMAL(10,0)) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS DECIMAL(10,0)) / CAST('2017-12-11 09:30:00' AS DATE))' (decimal(10,0) and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS DECIMAL(10,0)) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DECIMAL(10,0)\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -777,7 +1001,15 @@ SELECT cast(1 as string) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(CAST(1 AS STRING) AS DOUBLE) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(CAST(1 AS STRING) AS DOUBLE) / CAST('1' AS BINARY))' (double and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS STRING) / CAST(1 AS BINARY))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -786,7 +1018,15 @@ SELECT cast(1 as string) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(CAST(1 AS STRING) AS DOUBLE) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST(CAST(1 AS STRING) AS DOUBLE) / CAST(1 AS BOOLEAN))' (double and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS STRING) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -795,7 +1035,15 @@ SELECT cast(1 as string) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(CAST(1 AS STRING) AS DOUBLE) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(CAST(1 AS STRING) AS DOUBLE) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS STRING) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -804,7 +1052,15 @@ SELECT cast(1 as string) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(CAST(1 AS STRING) AS DOUBLE) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(CAST(1 AS STRING) AS DOUBLE) / CAST('2017-12-11 09:30:00' AS DATE))' (double and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS STRING) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -813,7 +1069,15 @@ SELECT cast('1' as binary) / cast(1 as tinyint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS TINYINT))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS TINYINT))' (binary and tinyint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS TINYINT))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"TINYINT\""
+  }
+}
 
 
 -- !query
@@ -822,7 +1086,15 @@ SELECT cast('1' as binary) / cast(1 as smallint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS SMALLINT))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS SMALLINT))' (binary and smallint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS SMALLINT))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"SMALLINT\""
+  }
+}
 
 
 -- !query
@@ -831,7 +1103,15 @@ SELECT cast('1' as binary) / cast(1 as int) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS INT))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS INT))' (binary and int).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS INT))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"INT\""
+  }
+}
 
 
 -- !query
@@ -840,7 +1120,15 @@ SELECT cast('1' as binary) / cast(1 as bigint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS BIGINT))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS BIGINT))' (binary and bigint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS BIGINT))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"BIGINT\""
+  }
+}
 
 
 -- !query
@@ -849,7 +1137,15 @@ SELECT cast('1' as binary) / cast(1 as float) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS FLOAT))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS FLOAT))' (binary and float).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS FLOAT))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"FLOAT\""
+  }
+}
 
 
 -- !query
@@ -858,7 +1154,15 @@ SELECT cast('1' as binary) / cast(1 as double) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS DOUBLE))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS DOUBLE))' (binary and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS DOUBLE))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -867,7 +1171,15 @@ SELECT cast('1' as binary) / cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS DECIMAL(10,0)))' (binary and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -876,7 +1188,15 @@ SELECT cast('1' as binary) / cast(1 as string) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(CAST(1 AS STRING) AS DOUBLE))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(CAST(1 AS STRING) AS DOUBLE))' (binary and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS STRING))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -885,7 +1205,15 @@ SELECT cast('1' as binary) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST('1' AS BINARY))' due to data type mismatch: '(CAST('1' AS BINARY) / CAST('1' AS BINARY))' requires (double or decimal) type, not binary; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_WRONG_TYPE",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS BINARY))\"",
+    "inputType" : "(\"DOUBLE\" or \"DECIMAL\")",
+    "actualDataType" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -894,7 +1222,15 @@ SELECT cast('1' as binary) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST(1 AS BOOLEAN))' (binary and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -903,7 +1239,15 @@ SELECT cast('1' as binary) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (binary and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -912,7 +1256,15 @@ SELECT cast('1' as binary) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST('2017-12-11 09:30:00' AS DATE))' (binary and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -921,7 +1273,15 @@ SELECT cast(1 as boolean) / cast(1 as tinyint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(1 AS TINYINT))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST(1 AS TINYINT))' (boolean and tinyint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS TINYINT))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"TINYINT\""
+  }
+}
 
 
 -- !query
@@ -930,7 +1290,15 @@ SELECT cast(1 as boolean) / cast(1 as smallint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(1 AS SMALLINT))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST(1 AS SMALLINT))' (boolean and smallint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS SMALLINT))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"SMALLINT\""
+  }
+}
 
 
 -- !query
@@ -939,7 +1307,15 @@ SELECT cast(1 as boolean) / cast(1 as int) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(1 AS INT))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST(1 AS INT))' (boolean and int).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS INT))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"INT\""
+  }
+}
 
 
 -- !query
@@ -948,7 +1324,15 @@ SELECT cast(1 as boolean) / cast(1 as bigint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(1 AS BIGINT))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST(1 AS BIGINT))' (boolean and bigint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS BIGINT))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"BIGINT\""
+  }
+}
 
 
 -- !query
@@ -957,7 +1341,15 @@ SELECT cast(1 as boolean) / cast(1 as float) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(1 AS FLOAT))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST(1 AS FLOAT))' (boolean and float).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS FLOAT))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"FLOAT\""
+  }
+}
 
 
 -- !query
@@ -966,7 +1358,15 @@ SELECT cast(1 as boolean) / cast(1 as double) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(1 AS DOUBLE))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST(1 AS DOUBLE))' (boolean and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS DOUBLE))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -975,7 +1375,15 @@ SELECT cast(1 as boolean) / cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST(1 AS DECIMAL(10,0)))' (boolean and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -984,7 +1392,15 @@ SELECT cast(1 as boolean) / cast(1 as string) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(CAST(1 AS STRING) AS DOUBLE))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST(CAST(1 AS STRING) AS DOUBLE))' (boolean and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS STRING))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -993,7 +1409,15 @@ SELECT cast(1 as boolean) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST('1' AS BINARY))' (boolean and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS BINARY))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -1002,7 +1426,15 @@ SELECT cast(1 as boolean) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST(1 AS BOOLEAN))' due to data type mismatch: '(CAST(1 AS BOOLEAN) / CAST(1 AS BOOLEAN))' requires (double or decimal) type, not boolean; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_WRONG_TYPE",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(1 AS BOOLEAN))\"",
+    "inputType" : "(\"DOUBLE\" or \"DECIMAL\")",
+    "actualDataType" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -1011,7 +1443,15 @@ SELECT cast(1 as boolean) / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (boolean and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -1020,7 +1460,15 @@ SELECT cast(1 as boolean) / cast('2017-12-11 09:30:00' as date) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST('2017-12-11 09:30:00' AS DATE))' (boolean and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -1029,7 +1477,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as tinyint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS TINYINT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS TINYINT))' (timestamp and tinyint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS TINYINT))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"TINYINT\""
+  }
+}
 
 
 -- !query
@@ -1038,7 +1494,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as smallint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS SMALLINT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS SMALLINT))' (timestamp and smallint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS SMALLINT))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"SMALLINT\""
+  }
+}
 
 
 -- !query
@@ -1047,7 +1511,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as int) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS INT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS INT))' (timestamp and int).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS INT))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"INT\""
+  }
+}
 
 
 -- !query
@@ -1056,7 +1528,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as bigint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS BIGINT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS BIGINT))' (timestamp and bigint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS BIGINT))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"BIGINT\""
+  }
+}
 
 
 -- !query
@@ -1065,7 +1545,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as float) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS FLOAT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS FLOAT))' (timestamp and float).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS FLOAT))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"FLOAT\""
+  }
+}
 
 
 -- !query
@@ -1074,7 +1562,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as double) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS DOUBLE))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1083,7 +1579,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as decimal(10, 0)) FR
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS DECIMAL(10,0)))' (timestamp and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -1092,7 +1596,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as string) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(CAST(1 AS STRING) AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(CAST(1 AS STRING) AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS STRING))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1101,7 +1613,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST('1' AS BINARY))' (timestamp and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS BINARY))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -1110,7 +1630,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST(1 AS BOOLEAN))' (timestamp and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -1119,7 +1647,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast('2017-12-11 09:30:00.0'
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' requires (double or decimal) type, not timestamp; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_WRONG_TYPE",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "inputType" : "(\"DOUBLE\" or \"DECIMAL\")",
+    "actualDataType" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -1128,7 +1664,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / cast('2017-12-11 09:30:00' a
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST('2017-12-11 09:30:00' AS DATE))' (timestamp and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -1137,7 +1681,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as tinyint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS TINYINT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS TINYINT))' (date and tinyint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS TINYINT))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"TINYINT\""
+  }
+}
 
 
 -- !query
@@ -1146,7 +1698,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as smallint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS SMALLINT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS SMALLINT))' (date and smallint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS SMALLINT))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"SMALLINT\""
+  }
+}
 
 
 -- !query
@@ -1155,7 +1715,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as int) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS INT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS INT))' (date and int).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS INT))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"INT\""
+  }
+}
 
 
 -- !query
@@ -1164,7 +1732,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as bigint) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS BIGINT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS BIGINT))' (date and bigint).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS BIGINT))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"BIGINT\""
+  }
+}
 
 
 -- !query
@@ -1173,7 +1749,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as float) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS FLOAT))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS FLOAT))' (date and float).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS FLOAT))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"FLOAT\""
+  }
+}
 
 
 -- !query
@@ -1182,7 +1766,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as double) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS DOUBLE))' (date and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS DOUBLE))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1191,7 +1783,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as decimal(10, 0)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(10,0)))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS DECIMAL(10,0)))' (date and decimal(10,0)).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS DECIMAL(10,0)))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DECIMAL(10,0)\""
+  }
+}
 
 
 -- !query
@@ -1200,7 +1800,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as string) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(CAST(1 AS STRING) AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(CAST(1 AS STRING) AS DOUBLE))' (date and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS STRING))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1209,7 +1817,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast('1' as binary) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST('1' AS BINARY))' (date and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS BINARY))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -1218,7 +1834,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast(1 as boolean) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST(1 AS BOOLEAN))' (date and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -1227,7 +1851,15 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast('2017-12-11 09:30:00.0' as tim
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (date and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DATE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -1236,4 +1868,12 @@ SELECT cast('2017-12-11 09:30:00' as date) / cast('2017-12-11 09:30:00' as date)
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: '(CAST('2017-12-11 09:30:00' AS DATE) / CAST('2017-12-11 09:30:00' AS DATE))' requires (double or decimal) type, not date; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_WRONG_TYPE",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "inputType" : "(\"DOUBLE\" or \"DECIMAL\")",
+    "actualDataType" : "\"DATE\""
+  }
+}
diff --git a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/promoteStrings.sql.out b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/promoteStrings.sql.out
index c24b06768e9..b866d457196 100644
--- a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/promoteStrings.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/promoteStrings.sql.out
@@ -77,7 +77,15 @@ SELECT '1' + cast('1' as binary)                        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) + CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) + CAST('1' AS BINARY))' (double and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + CAST(1 AS BINARY))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -86,7 +94,15 @@ SELECT '1' + cast(1 as boolean)                         FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) + CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) + CAST(1 AS BOOLEAN))' (double and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -95,7 +111,15 @@ SELECT '1' + cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) + CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 + CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -177,7 +201,15 @@ SELECT '1' - cast('1' as binary)                        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) - CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) - CAST('1' AS BINARY))' (double and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 - CAST(1 AS BINARY))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -186,7 +218,15 @@ SELECT '1' - cast(1 as boolean)                         FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) - CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) - CAST(1 AS BOOLEAN))' (double and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 - CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -276,7 +316,15 @@ SELECT '1' * cast('1' as binary)                        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) * CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) * CAST('1' AS BINARY))' (double and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 * CAST(1 AS BINARY))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -285,7 +333,15 @@ SELECT '1' * cast(1 as boolean)                         FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) * CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) * CAST(1 AS BOOLEAN))' (double and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 * CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -294,7 +350,15 @@ SELECT '1' * cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) * CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) * CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 * CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -303,7 +367,15 @@ SELECT '1' * cast('2017-12-11 09:30:00' as date)        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) * CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) * CAST('2017-12-11 09:30:00' AS DATE))' (double and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 * CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -376,7 +448,15 @@ SELECT '1' / cast('1' as binary)                        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) / CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) / CAST('1' AS BINARY))' (double and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 / CAST(1 AS BINARY))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -385,7 +465,15 @@ SELECT '1' / cast(1 as boolean)                         FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) / CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) / CAST(1 AS BOOLEAN))' (double and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 / CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -394,7 +482,15 @@ SELECT '1' / cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) / CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 / CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -403,7 +499,15 @@ SELECT '1' / cast('2017-12-11 09:30:00' as date)        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) / CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) / CAST('2017-12-11 09:30:00' AS DATE))' (double and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 / CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -476,7 +580,15 @@ SELECT '1' % cast('1' as binary)                        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) % CAST('1' AS BINARY))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) % CAST('1' AS BINARY))' (double and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 % CAST(1 AS BINARY))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -485,7 +597,15 @@ SELECT '1' % cast(1 as boolean)                         FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) % CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) % CAST(1 AS BOOLEAN))' (double and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 % CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -494,7 +614,15 @@ SELECT '1' % cast('2017-12-11 09:30:00.0' as timestamp) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) % CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 % CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -503,7 +631,15 @@ SELECT '1' % cast('2017-12-11 09:30:00' as date)        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS DOUBLE) % CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in '(CAST('1' AS DOUBLE) % CAST('2017-12-11 09:30:00' AS DATE))' (double and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(1 % CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -576,7 +712,15 @@ SELECT pmod('1', cast('1' as binary))                        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS DOUBLE), CAST('1' AS BINARY))' due to data type mismatch: differing types in 'pmod(CAST('1' AS DOUBLE), CAST('1' AS BINARY))' (double and binary).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(1, CAST(1 AS BINARY))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BINARY\""
+  }
+}
 
 
 -- !query
@@ -585,7 +729,15 @@ SELECT pmod('1', cast(1 as boolean))                         FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS DOUBLE), CAST(1 AS BOOLEAN))' due to data type mismatch: differing types in 'pmod(CAST('1' AS DOUBLE), CAST(1 AS BOOLEAN))' (double and boolean).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(1, CAST(1 AS BOOLEAN))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"BOOLEAN\""
+  }
+}
 
 
 -- !query
@@ -594,7 +746,15 @@ SELECT pmod('1', cast('2017-12-11 09:30:00.0' as timestamp)) FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS DOUBLE), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' due to data type mismatch: differing types in 'pmod(CAST('1' AS DOUBLE), CAST('2017-12-11 09:30:00.0' AS TIMESTAMP))' (double and timestamp).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(1, CAST(2017-12-11 09:30:00.0 AS TIMESTAMP))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"TIMESTAMP\""
+  }
+}
 
 
 -- !query
@@ -603,7 +763,15 @@ SELECT pmod('1', cast('2017-12-11 09:30:00' as date))        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS DOUBLE), CAST('2017-12-11 09:30:00' AS DATE))' due to data type mismatch: differing types in 'pmod(CAST('1' AS DOUBLE), CAST('2017-12-11 09:30:00' AS DATE))' (double and date).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(1, CAST(2017-12-11 09:30:00 AS DATE))\"",
+    "left" : "\"DOUBLE\"",
+    "right" : "\"DATE\""
+  }
+}
 
 
 -- !query
@@ -668,7 +836,15 @@ SELECT cast('1' as binary)                        + '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) + CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) + CAST('1' AS DOUBLE))' (binary and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) + 1)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -677,7 +853,15 @@ SELECT cast(1 as boolean)                         + '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) + CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) + CAST('1' AS DOUBLE))' (boolean and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) + 1)\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -686,7 +870,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) + '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) + CAST('1' AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) + 1)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -760,7 +952,15 @@ SELECT cast('1' as binary)                        - '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) - CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) - CAST('1' AS DOUBLE))' (binary and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) - 1)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -769,7 +969,15 @@ SELECT cast(1 as boolean)                         - '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) - CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) - CAST('1' AS DOUBLE))' (boolean and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) - 1)\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -852,7 +1060,15 @@ SELECT cast('1' as binary)                        * '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) * CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) * CAST('1' AS DOUBLE))' (binary and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) * 1)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -861,7 +1077,15 @@ SELECT cast(1 as boolean)                         * '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) * CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) * CAST('1' AS DOUBLE))' (boolean and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) * 1)\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -870,7 +1094,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) * '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) * CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) * CAST('1' AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) * 1)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -879,7 +1111,15 @@ SELECT cast('2017-12-11 09:30:00' as date)        * '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) * CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) * CAST('1' AS DOUBLE))' (date and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) * 1)\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -944,7 +1184,15 @@ SELECT cast('1' as binary)                        / '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) / CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) / CAST('1' AS DOUBLE))' (binary and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) / 1)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -953,7 +1201,15 @@ SELECT cast(1 as boolean)                         / '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) / CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) / CAST('1' AS DOUBLE))' (boolean and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) / 1)\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -962,7 +1218,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) / '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) / CAST('1' AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) / 1)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -971,7 +1235,15 @@ SELECT cast('2017-12-11 09:30:00' as date)        / '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) / CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) / CAST('1' AS DOUBLE))' (date and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) / 1)\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1036,7 +1308,15 @@ SELECT cast('1' as binary)                        % '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('1' AS BINARY) % CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('1' AS BINARY) % CAST('1' AS DOUBLE))' (binary and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BINARY) % 1)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1045,7 +1325,15 @@ SELECT cast(1 as boolean)                         % '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST(1 AS BOOLEAN) % CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST(1 AS BOOLEAN) % CAST('1' AS DOUBLE))' (boolean and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(1 AS BOOLEAN) % 1)\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1054,7 +1342,15 @@ SELECT cast('2017-12-11 09:30:00.0' as timestamp) % '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP) % CAST('1' AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP) % 1)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1063,7 +1359,15 @@ SELECT cast('2017-12-11 09:30:00' as date)        % '1' FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve '(CAST('2017-12-11 09:30:00' AS DATE) % CAST('1' AS DOUBLE))' due to data type mismatch: differing types in '(CAST('2017-12-11 09:30:00' AS DATE) % CAST('1' AS DOUBLE))' (date and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"(CAST(2017-12-11 09:30:00 AS DATE) % 1)\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1128,7 +1432,15 @@ SELECT pmod(cast('1' as binary), '1')                        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('1' AS BINARY), CAST('1' AS DOUBLE))' due to data type mismatch: differing types in 'pmod(CAST('1' AS BINARY), CAST('1' AS DOUBLE))' (binary and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS BINARY), 1)\"",
+    "left" : "\"BINARY\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1137,7 +1449,15 @@ SELECT pmod(cast(1 as boolean), '1')                         FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST(1 AS BOOLEAN), CAST('1' AS DOUBLE))' due to data type mismatch: differing types in 'pmod(CAST(1 AS BOOLEAN), CAST('1' AS DOUBLE))' (boolean and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(1 AS BOOLEAN), 1)\"",
+    "left" : "\"BOOLEAN\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1146,7 +1466,15 @@ SELECT pmod(cast('2017-12-11 09:30:00.0' as timestamp), '1') FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST('1' AS DOUBLE))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00.0' AS TIMESTAMP), CAST('1' AS DOUBLE))' (timestamp and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00.0 AS TIMESTAMP), 1)\"",
+    "left" : "\"TIMESTAMP\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
@@ -1155,7 +1483,15 @@ SELECT pmod(cast('2017-12-11 09:30:00' as date), '1')        FROM t
 struct<>
 -- !query output
 org.apache.spark.sql.AnalysisException
-cannot resolve 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST('1' AS DOUBLE))' due to data type mismatch: differing types in 'pmod(CAST('2017-12-11 09:30:00' AS DATE), CAST('1' AS DOUBLE))' (date and double).; line 1 pos 7
+{
+  "errorClass" : "DATATYPE_MISMATCH",
+  "errorSubClass" : "BINARY_OP_DIFF_TYPES",
+  "messageParameters" : {
+    "sqlExpr" : "\"pmod(CAST(2017-12-11 09:30:00 AS DATE), 1)\"",
+    "left" : "\"DATE\"",
+    "right" : "\"DOUBLE\""
+  }
+}
 
 
 -- !query
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
index 0854c6ba457..43f494a5811 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
@@ -2663,13 +2663,16 @@ class SQLQuerySuite extends QueryTest with SharedSparkSession with AdaptiveSpark
         sql("CREATE TABLE t(c struct<f:int>) USING parquet")
         sql("CREATE TABLE S(C struct<F:int>) USING parquet")
         checkAnswer(sql("SELECT * FROM t, S WHERE t.c.f = S.C.F"), Seq.empty)
-        val m = intercept[AnalysisException] {
-          sql("SELECT * FROM t, S WHERE c = C")
-        }.message
-        assert(
-          m.contains(
-            "cannot resolve '(spark_catalog.default.t.c = " +
-            "spark_catalog.default.S.C)' due to data type mismatch"))
+        checkError(
+          exception = intercept[AnalysisException] {
+            sql("SELECT * FROM t, S WHERE c = C")
+          },
+          errorClass = "DATATYPE_MISMATCH",
+          errorSubClass = Some("BINARY_OP_DIFF_TYPES"),
+          parameters = Map(
+            "sqlExpr" -> "\"(c = C)\"",
+            "left" -> "\"STRUCT<f: INT>\"",
+            "right" -> "\"STRUCT<F: INT>\""))
       }
     }
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org