psixto-denodo opened a new issue, #838:
URL: https://github.com/apache/arrow-java/issues/838

   ### Describe the bug, including details regarding any error messages, 
version, and platform.
   
   The FlightSQL JDBC driver always treats timestamps as milliseconds when 
sending them to the server, ignoring the connection setting timeStampPrecision 
(for example microseconds). As a result, when the connection precision is set 
to microseconds the driver truncates/offsets the timestamp and the value stored 
on the server is incorrect.
   
   Expected behavior When the JDBC connection option timeStampPrecision is set 
(e.g. microseconds, milliseconds, nanoseconds), PreparedStatement#setTimestamp 
(and setTimestamp with timestamptz) should send timestamps with the configured 
precision so the server receives the correct epoch value.
   
   Actual behavior The driver converts java.sql.Timestamp values to an epoch 
value assuming milliseconds. If the connection is configured for microseconds 
(or other precision) the conversion is incorrect and inserted timestamps are 
wrong.
   
   ```
   // Connection includes timeStampPrecision parameter (example: microseconds)
   String jdbcUrlFlight = 
"jdbc:arrow-flight-sql://localhost:9994?useEncryption=0&timeStampPrecision=microseconds";
   try (Connection conn = DriverManager.getConnection(jdbcUrlFlight);
        PreparedStatement stmt = conn.prepareStatement("INSERT INTO ... VALUES 
(?, ?, ?, ?, ?)")) {
   
       for (RowData row : generatedData) {
           stmt.setDate(1, row.c_date());
           stmt.setTime(2, row.c_time());
           stmt.setTime(3, row.c_timetz());
           stmt.setTimestamp(4, row.c_timestamp());      // incorrect 
conversion happens here
           stmt.setTimestamp(5, row.c_timestamptz());   // and here
           stmt.addBatch();
       }
       stmt.executeBatch();
   }
   ```
   
   Example A — connection configured for microseconds (bug triggered)
   
   - Value I want to insert:
       - Timestamp object: "2024-11-03 12:45:09.869885001"
       - nanos = 869885001
       - fastTime = 1730634309000
   
   - **DateTimeUtils#sqlTimestampToUnixTimestamp(Timestamp, TimeZone) returns: 
1730637909869**:
       - Interpreted as milliseconds, that is: **2024-11-03 12:45:09.869** 
(GMT)    
       
   - Final value inserted into server: **1970-01-21 00:43:57.909869**
       - Incorrect because the connection used microsecond precision but driver 
treated the value as milliseconds.
       
   Example B — connection set to milliseconds (works)
   
   - Connection: ?timeStampPrecision=milliseconds
   - Value I want to insert:
       - "**2023-11-29 09:47:32.659534860**"
       - nanos = 659534860
       - fastTime = 1701247652000
   - Driver sends: 1701251252659 (interpreted as milliseconds)
   
   - Server receives: **2023-11-29 09:47:32.659** — correct when precision is 
milliseconds.
   
   Environment
     - flight-sql-jdbc-driver-18.3.0.jar
     - Java: 17
     - Server FlightSQL implementation/version: 18.2
     - OS: Windows
     
   Relevant code & suspected area
   
   DateTimeUtils#sqlTimestampToUnixTimestamp(Timestamp, TimeZone) appears to be 
converting timestamps assuming millisecond precision. 
   ```
   public static long sqlTimestampToUnixTimestamp(Timestamp timestamp, TimeZone 
timeZone) {
           long time = timestamp.getTime();
           LocalDateTime dateTime = timestamp.toLocalDateTime();
           long unixTimestamp = dateTime.toEpochSecond(ZoneOffset.UTC) * 1000L 
+ (long)dateTime.get(ChronoField.MILLI_OF_SECOND);
           if (timeZone != null) {
               unixTimestamp += (long)timeZone.getOffset(time);
           }
   
           unixTimestamp -= (long)DEFAULT_ZONE.getOffset(time);
           return unixTimestamp;
       }
   ```
   
   The driver should respect the connection timeStampPrecision parameter, and 
correctlyreturn the exact epoch value (as a long) at the configured timestamp 
precision.


-- 
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: issues-unsubscr...@arrow.apache.org.apache.org

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

Reply via email to