Repository: spark
Updated Branches:
  refs/heads/master ca1b21985 -> 917d05f43


[SPARK-12928][SQL] Oracle FLOAT datatype is not properly handled when reading 
via JDBC

The contribution is my original work and that I license the work to the project 
under the project's open source license.

Author: poolis <[email protected]>
Author: Greg Michalopoulos <[email protected]>

Closes #10899 from poolis/spark-12928.


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/917d05f4
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/917d05f4
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/917d05f4

Branch: refs/heads/master
Commit: 917d05f43bddc1728735979fe7e62fe631b35e6f
Parents: ca1b219
Author: poolis <[email protected]>
Authored: Mon May 2 16:15:07 2016 -0700
Committer: Reynold Xin <[email protected]>
Committed: Mon May 2 16:15:07 2016 -0700

----------------------------------------------------------------------
 .../scala/org/apache/spark/sql/jdbc/OracleDialect.scala     | 6 ++++++
 .../test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala    | 9 +++++++++
 2 files changed, 15 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/917d05f4/sql/core/src/main/scala/org/apache/spark/sql/jdbc/OracleDialect.scala
----------------------------------------------------------------------
diff --git 
a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/OracleDialect.scala 
b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/OracleDialect.scala
index 46b3877..b795e8b 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/jdbc/OracleDialect.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/jdbc/OracleDialect.scala
@@ -38,6 +38,12 @@ private case object OracleDialect extends JdbcDialect {
       // This is sub-optimal as we have to pick a precision/scale in advance 
whereas the data
       //  in Oracle is allowed to have different precision/scale for each 
value.
       Option(DecimalType(DecimalType.MAX_PRECISION, 10))
+    } else if (sqlType == Types.NUMERIC && md.build().getLong("scale") == 
-127) {
+      // Handle FLOAT fields in a special way because JDBC ResultSetMetaData 
converts
+      // this to NUMERIC with -127 scale
+      // Not sure if there is a more robust way to identify the field as a 
float (or other
+      // numeric types that do not specify a scale.
+      Option(DecimalType(DecimalType.MAX_PRECISION, 10))
     } else {
       None
     }

http://git-wip-us.apache.org/repos/asf/spark/blob/917d05f4/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala 
b/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala
index 783511b..47a1017 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala
@@ -600,6 +600,15 @@ class JDBCSuite extends SparkFunSuite
     
assert(derbyDialect.getJDBCType(BooleanType).map(_.databaseTypeDefinition).get 
== "BOOLEAN")
   }
 
+  test("OracleDialect jdbc type mapping") {
+    val oracleDialect = JdbcDialects.get("jdbc:oracle")
+    val metadata = new MetadataBuilder().putString("name", 
"test_column").putLong("scale", -127)
+    assert(oracleDialect.getCatalystType(java.sql.Types.NUMERIC, "float", 1, 
metadata) ==
+      Some(DecimalType(DecimalType.MAX_PRECISION, 10)))
+    assert(oracleDialect.getCatalystType(java.sql.Types.NUMERIC, "numeric", 0, 
null) ==
+      Some(DecimalType(DecimalType.MAX_PRECISION, 10)))
+  }
+
   test("table exists query by jdbc dialect") {
     val MySQL = JdbcDialects.get("jdbc:mysql://127.0.0.1/db")
     val Postgres = JdbcDialects.get("jdbc:postgresql://127.0.0.1/db")


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to