sunxiaoguang commented on code in PR #49453:
URL: https://github.com/apache/spark/pull/49453#discussion_r1919787981


##########
connector/docker-integration-tests/src/test/scala/org/apache/spark/sql/jdbc/v2/MySQLIntegrationSuite.scala:
##########
@@ -241,6 +241,72 @@ class MySQLIntegrationSuite extends 
DockerJDBCIntegrationV2Suite with V2JDBCTest
     assert(rows10(0).getString(0) === "amy")
     assert(rows10(1).getString(0) === "alex")
   }
+
+  test("SPARK-50793: MySQL JDBC Connector failed to cast some types") {
+    val tableName = catalogName + ".test_cast_function"
+    withTable(tableName) {
+      val stringValue = "0"
+      val stringLiteral = "'0'"
+      val longValue = 0L
+      val binaryValue = Array[Byte](0x30)
+      val binaryLiteral = "x'30'"
+      val doubleValue = 0.0
+      val doubleLiteral = "0.0"
+      // CREATE table to use types defined in Spark SQL
+      sql(s"""CREATE TABLE $tableName (
+        string_col STRING,
+        long_col LONG,
+        binary_col BINARY,
+        double_col DOUBLE
+      )""")
+      sql(
+        s"INSERT INTO $tableName VALUES($stringLiteral, $longValue, 
$binaryLiteral, $doubleValue)")
+
+      def testCast(castType: String, sourceCol: String, targetCol: String,
+                   sourceDataType: DataType, sourceValue: Any,
+                   targetDataType: DataType, targetValue: Any): Unit = {
+        val sql =
+          s"""SELECT $sourceCol AS source, CAST($sourceCol AS $castType) AS 
target FROM $tableName
+             |WHERE CAST($sourceCol AS $castType) = $targetCol""".stripMargin
+        val df = spark.sql(sql)
+        castType match {
+          case "SHORT" | "INTEGER" =>
+            checkError(
+              exception = intercept[SparkException] {
+                df.collect()
+              },
+              condition = null
+            )

Review Comment:
   In case I make mistake again, here is what my understanding is. Let's see 
which part should be changed.
   
   1. It looks like `visitCast` is always called without configuration item to 
opt out.
   2. We added guards in `visitCast` to throw exceptions explicitly for two 
types `SHORT` and `INTEGER` to avoid CAST being used in projection and 
producing incorrect type metadata accidentally.
   3. We want to validate the cases where `DOUBLE`, `LONGTEXT`, `BIGINT` and 
`BLOB` types are used in `cast` and producing the expected resultset including 
the types in schema.
   4. We want to validate the cases where `SHORT` and `INTEGER` which are 
explicitly disabled are used which generates error during execution.
   5. For other cases not involving cast, `SHORT` and `INTEGER` are going to 
work without any issue.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to