21
21
import io .cdap .plugin .db .ColumnType ;
22
22
import io .cdap .plugin .db .DBRecord ;
23
23
import io .cdap .plugin .db .SchemaReader ;
24
-
25
24
import java .sql .ResultSet ;
26
25
import java .sql .SQLException ;
26
+ import java .sql .Timestamp ;
27
27
import java .sql .Types ;
28
28
import java .util .List ;
29
29
30
30
/**
31
- * SQL Server Source implementation {@link org.apache.hadoop.mapreduce.lib.db.DBWritable} and
32
- * {@link org.apache.hadoop.io.Writable}.
31
+ * SQL Server Source implementation {@link org.apache.hadoop.mapreduce.lib.db.DBWritable} and {@link
32
+ * org.apache.hadoop.io.Writable}.
33
33
*/
34
34
public class SqlServerSourceDBRecord extends DBRecord {
35
35
@@ -42,14 +42,17 @@ public SqlServerSourceDBRecord() {
42
42
}
43
43
44
44
@ Override
45
- protected void handleField (ResultSet resultSet , StructuredRecord .Builder recordBuilder , Schema .Field field ,
46
- int columnIndex , int sqlType , int sqlPrecision , int sqlScale ) throws SQLException {
45
+ protected void handleField (ResultSet resultSet , StructuredRecord .Builder recordBuilder ,
46
+ Schema .Field field ,
47
+ int columnIndex , int sqlType , int sqlPrecision , int sqlScale ) throws SQLException {
47
48
switch (sqlType ) {
48
49
case Types .TIME :
49
50
// Handle reading SQL Server 'TIME' data type to avoid accuracy loss.
50
51
// 'TIME' data type has the accuracy of 100 nanoseconds(1 millisecond in Informatica)
51
52
// but reading via 'getTime' and 'getObject' will round value to second.
52
- recordBuilder .setTime (field .getName (), resultSet .getTimestamp (columnIndex ).toLocalDateTime ().toLocalTime ());
53
+ final Timestamp timestamp = resultSet .getTimestamp (columnIndex );
54
+ recordBuilder .setTime (field .getName (),
55
+ timestamp == null ? null : timestamp .toLocalDateTime ().toLocalTime ());
53
56
break ;
54
57
case SqlServerSourceSchemaReader .DATETIME_OFFSET_TYPE :
55
58
recordBuilder .set (field .getName (), resultSet .getString (columnIndex ));
0 commit comments