From ee044a88f9044ed07e2d9792b79d0ea1c2698912 Mon Sep 17 00:00:00 2001 From: Terry Chow <32403408+tkyc@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:03:49 -0700 Subject: [PATCH] Fixed timestamp string conversion error for cstmt (#2449) (#2455) * Fixed timestamp string conversion error for cstmt * Code review comments p1 * Fixed sproc used in test Co-authored-by: Jeff Wasty --- .../com/microsoft/sqlserver/jdbc/dtv.java | 3 +++ .../CallableStatementTest.java | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java b/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java index c03d67eb0..1411d3f36 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java @@ -24,6 +24,7 @@ import java.sql.Blob; import java.sql.Clob; import java.sql.SQLException; +import java.sql.Timestamp; import java.text.MessageFormat; import java.time.LocalDate; import java.time.LocalDateTime; @@ -1627,6 +1628,8 @@ final void executeOp(DTVExecuteOp op) throws SQLServerException { op.execute(this, ((Geometry) value).serialize()); } else if (JDBCType.GEOGRAPHY == jdbcType) { op.execute(this, ((Geography) value).serialize()); + } else if (JDBCType.TIMESTAMP == jdbcType) { + op.execute(this, Timestamp.valueOf((String) value)); } else { if (null != cryptoMeta) { // if streaming types check for allowed data length in AE diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/callablestatement/CallableStatementTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/callablestatement/CallableStatementTest.java index 8463ab25f..47f7cabdc 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/callablestatement/CallableStatementTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/callablestatement/CallableStatementTest.java @@ -70,6 +70,8 @@ public class CallableStatementTest extends AbstractTest { .escapeIdentifier(RandomUtil.getIdentifier("manyParam_Table")); private static String manyParamProc = AbstractSQLGenerator .escapeIdentifier(RandomUtil.getIdentifier("manyParam_Procedure")); + private static String currentTimeProc = AbstractSQLGenerator + .escapeIdentifier(RandomUtil.getIdentifier("currentTime_Procedure")); private static String manyParamUserDefinedType = AbstractSQLGenerator .escapeIdentifier(RandomUtil.getIdentifier("manyParam_definedType")); private static String zeroParamSproc = AbstractSQLGenerator @@ -114,6 +116,7 @@ public static void setupTest() throws Exception { createUserDefinedType(); createTableManyParams(); createProcedureManyParams(); + createProcedureCurrentTime(); createGetObjectOffsetDateTimeProcedure(stmt); createProcedureZeroParams(); createOutOfOrderSproc(); @@ -1260,6 +1263,17 @@ public void testFourPartSyntaxCallEscapeSyntax() throws SQLException { } } + @Test + public void testTimestampStringConversion() throws SQLException { + try (CallableStatement stmt = connection.prepareCall("{call " + currentTimeProc + "(?)}")) { + String timestamp = "2024-05-29 15:35:53.461"; + stmt.setObject(1, timestamp, Types.TIMESTAMP); + stmt.registerOutParameter(1, Types.TIMESTAMP); + stmt.execute(); + stmt.getObject("currentTimeStamp"); + } + } + /** * Cleanup after test * @@ -1278,6 +1292,7 @@ public static void cleanup() throws SQLException { TestUtils.dropProcedureIfExists(zeroParamSproc, stmt); TestUtils.dropProcedureIfExists(outOfOrderSproc, stmt); TestUtils.dropProcedureIfExists(byParamNameSproc, stmt); + TestUtils.dropProcedureIfExists(currentTimeProc, stmt); TestUtils.dropProcedureIfExists(conditionalSproc, stmt); TestUtils.dropFunctionIfExists(userDefinedFunction, stmt); } @@ -1331,6 +1346,14 @@ private static void createProcedureManyParams() throws SQLException { } } + private static void createProcedureCurrentTime() throws SQLException { + String sql = "CREATE PROCEDURE " + currentTimeProc + " @currentTimeStamp datetime = null OUTPUT " + + "AS BEGIN SET @currentTimeStamp = CURRENT_TIMESTAMP; END"; + try (Statement stmt = connection.createStatement()) { + stmt.execute(sql); + } + } + private static void createConditionalProcedure() throws SQLException { String sql = "CREATE PROCEDURE " + conditionalSproc + " @param0 INT, @param1 INT, @maybe bigint = 2 " + "AS BEGIN IF @maybe >= 2 BEGIN SELECT 5 END END";