Skip to content

Commit 6702324

Browse files
viiryarxin
authored andcommitted
[SPARK-7196][SQL] Support precision and scale of decimal type for JDBC
JIRA: https://issues.apache.org/jira/browse/SPARK-7196 Author: Liang-Chi Hsieh <[email protected]> Closes apache#5777 from viirya/jdbc_precision and squashes the following commits: f40f5e6 [Liang-Chi Hsieh] Support precision and scale for NUMERIC type. 49acbf9 [Liang-Chi Hsieh] Add unit test. a509e19 [Liang-Chi Hsieh] Support precision and scale of decimal type for JDBC.
1 parent e0628f2 commit 6702324

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

sql/core/src/main/scala/org/apache/spark/sql/jdbc/JDBCRDD.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private[sql] object JDBCRDD extends Logging {
3737
* @param sqlType - A field of java.sql.Types
3838
* @return The Catalyst type corresponding to sqlType.
3939
*/
40-
private def getCatalystType(sqlType: Int): DataType = {
40+
private def getCatalystType(sqlType: Int, precision: Int, scale: Int): DataType = {
4141
val answer = sqlType match {
4242
case java.sql.Types.ARRAY => null
4343
case java.sql.Types.BIGINT => LongType
@@ -49,6 +49,8 @@ private[sql] object JDBCRDD extends Logging {
4949
case java.sql.Types.CLOB => StringType
5050
case java.sql.Types.DATALINK => null
5151
case java.sql.Types.DATE => DateType
52+
case java.sql.Types.DECIMAL
53+
if precision != 0 || scale != 0 => DecimalType(precision, scale)
5254
case java.sql.Types.DECIMAL => DecimalType.Unlimited
5355
case java.sql.Types.DISTINCT => null
5456
case java.sql.Types.DOUBLE => DoubleType
@@ -61,6 +63,8 @@ private[sql] object JDBCRDD extends Logging {
6163
case java.sql.Types.NCHAR => StringType
6264
case java.sql.Types.NCLOB => StringType
6365
case java.sql.Types.NULL => null
66+
case java.sql.Types.NUMERIC
67+
if precision != 0 || scale != 0 => DecimalType(precision, scale)
6468
case java.sql.Types.NUMERIC => DecimalType.Unlimited
6569
case java.sql.Types.NVARCHAR => StringType
6670
case java.sql.Types.OTHER => null
@@ -109,10 +113,11 @@ private[sql] object JDBCRDD extends Logging {
109113
val dataType = rsmd.getColumnType(i + 1)
110114
val typeName = rsmd.getColumnTypeName(i + 1)
111115
val fieldSize = rsmd.getPrecision(i + 1)
116+
val fieldScale = rsmd.getScale(i + 1)
112117
val nullable = rsmd.isNullable(i + 1) != ResultSetMetaData.columnNoNulls
113118
val metadata = new MetadataBuilder().putString("name", columnName)
114119
var columnType = quirks.getCatalystType(dataType, typeName, fieldSize, metadata)
115-
if (columnType == null) columnType = getCatalystType(dataType)
120+
if (columnType == null) columnType = getCatalystType(dataType, fieldSize, fieldScale)
116121
fields(i) = StructField(columnName, columnType, nullable, metadata.build())
117122
i = i + 1
118123
}
@@ -307,6 +312,7 @@ private[sql] class JDBCRDD(
307312
case BooleanType => BooleanConversion
308313
case DateType => DateConversion
309314
case DecimalType.Unlimited => DecimalConversion
315+
case DecimalType.Fixed(d) => DecimalConversion
310316
case DoubleType => DoubleConversion
311317
case FloatType => FloatConversion
312318
case IntegerType => IntegerConversion

sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import java.sql.DriverManager
2222
import java.util.{Calendar, GregorianCalendar, Properties}
2323

2424
import org.apache.spark.sql.test._
25+
import org.apache.spark.sql.types._
2526
import org.h2.jdbc.JdbcSQLException
2627
import org.scalatest.{FunSuite, BeforeAndAfter}
2728
import TestSQLContext._
@@ -271,6 +272,7 @@ class JDBCSuite extends FunSuite with BeforeAndAfter {
271272
assert(rows(0).getDouble(1) === 1.00000011920928955) // Yes, I meant ==.
272273
assert(rows(0).getAs[BigDecimal](2)
273274
.equals(new BigDecimal("123456789012345.54321543215432100000")))
275+
assert(rows(0).schema.fields(2).dataType === DecimalType(40, 20))
274276
}
275277

276278
test("SQL query as table name") {

0 commit comments

Comments
 (0)