This is an automated email from the ASF dual-hosted git repository. joewitt pushed a commit to branch support/nifi-1.11.x in repository https://gitbox.apache.org/repos/asf/nifi.git
commit e1c26560055d1869188d4eb0cfb02df8e3345ce5 Author: Matthew Burgess <[email protected]> AuthorDate: Wed Feb 26 18:21:11 2020 -0500 NIFI-7208: Fixed PutSQL/JdbcCommon handling of timestamps (nanoseconds, e.g.) --- .../java/org/apache/nifi/util/db/JdbcCommon.java | 13 ++++++------- .../apache/nifi/processors/standard/TestPutSQL.java | 21 ++++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java b/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java index 34c27c2..30ac518 100644 --- a/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java +++ b/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java @@ -79,7 +79,6 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.time.temporal.TemporalAccessor; import java.util.Date; import java.util.Map; import java.util.function.Function; @@ -773,10 +772,11 @@ public class JdbcCommon { stmt.setTime(parameterIndex, time); break; case Types.TIMESTAMP: - long lTimestamp=0L; + Timestamp ts; // Backwards compatibility note: Format was unsupported for a timestamp field. if (valueFormat.equals("")) { + long lTimestamp = 0L; if(LONG_PATTERN.matcher(parameterValue).matches()){ lTimestamp = Long.parseLong(parameterValue); } else { @@ -784,15 +784,14 @@ public class JdbcCommon { java.util.Date parsedDate = dateFormat.parse(parameterValue); lTimestamp = parsedDate.getTime(); } + ts = new Timestamp(lTimestamp); } else { final DateTimeFormatter dtFormatter = getDateTimeFormatter(valueFormat); - TemporalAccessor accessor = dtFormatter.parse(parameterValue); - java.util.Date parsedDate = java.util.Date.from(Instant.from(accessor)); - lTimestamp = parsedDate.getTime(); + LocalDateTime ldt = LocalDateTime.parse(parameterValue, dtFormatter); + ts = Timestamp.from(ldt.atZone(ZoneId.of("UTC")).toInstant()); } - stmt.setTimestamp(parameterIndex, new Timestamp(lTimestamp)); - + stmt.setTimestamp(parameterIndex, ts); break; case Types.BINARY: case Types.VARBINARY: diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutSQL.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutSQL.java index 5d155ee..510e384 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutSQL.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutSQL.java @@ -434,16 +434,20 @@ public class TestPutSQL { runner.enableControllerService(service); runner.setProperty(PutSQL.CONNECTION_POOL, "dbcp"); - final String dateStr = "2002-02-02T12:02:02+00:00"; - final long dateInt = 1012651322000L; + final String dateStr1 = "2002-02-02T12:02:02+00:00"; + final long dateInt1 = 1012651322000L; + + final String dateStr2 = "2002-02-02T12:02:02.123456789"; + final long dateInt2 = 1012651322123L; + final long nanoInt2 = 123456789L; final Map<String, String> attributes = new HashMap<>(); attributes.put("sql.args.1.type", String.valueOf(Types.TIMESTAMP)); - attributes.put("sql.args.1.value", dateStr); + attributes.put("sql.args.1.value", dateStr1); attributes.put("sql.args.1.format", "ISO_OFFSET_DATE_TIME"); attributes.put("sql.args.2.type", String.valueOf(Types.TIMESTAMP)); - attributes.put("sql.args.2.value", dateStr); - attributes.put("sql.args.2.format", "yyyy-MM-dd'T'HH:mm:ssXXX"); + attributes.put("sql.args.2.value", dateStr2); + attributes.put("sql.args.2.format", "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS"); runner.enqueue("INSERT INTO TIMESTAMPTEST2 (ID, ts1, ts2) VALUES (1, ?, ?)".getBytes(), attributes); runner.run(); @@ -455,8 +459,9 @@ public class TestPutSQL { final ResultSet rs = stmt.executeQuery("SELECT * FROM TIMESTAMPTEST2"); assertTrue(rs.next()); assertEquals(1, rs.getInt(1)); - assertEquals(dateInt, rs.getTimestamp(2).getTime()); - assertEquals(dateInt, rs.getTimestamp(3).getTime()); + assertEquals(dateInt1, rs.getTimestamp(2).getTime()); + assertEquals(dateInt2, rs.getTimestamp(3).getTime()); + assertEquals(nanoInt2, rs.getTimestamp(3).getNanos()); assertFalse(rs.next()); } } @@ -477,11 +482,9 @@ public class TestPutSQL { final String dateStr = "2002-03-04"; final String timeStr = "02:03:04"; - final String timeFormatString = "HH:mm:ss"; final String dateFormatString ="yyyy-MM-dd"; - final DateTimeFormatter timeFormatter= DateTimeFormatter.ISO_LOCAL_TIME; LocalTime parsedTime = LocalTime.parse(timeStr, timeFormatter); Time expectedTime = Time.valueOf(parsedTime);
