diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerParameterMetaData.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerParameterMetaData.java index aeeeeb5a79..2e0486859b 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerParameterMetaData.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerParameterMetaData.java @@ -176,8 +176,13 @@ final public String toString() { } if (nState == 1) { if (sToken.trim().length() > 0) { - if (sToken.charAt(0) != ',') + if (sToken.charAt(0) != ',') { sLastField = escapeParse(st, sToken); + + // in case the parameter has braces in its name, e.g. [c2_nvarchar(max)], the original sToken variable just + // contains [c2_nvarchar, sLastField actually has the whole name [c2_nvarchar(max)] + sTokenIndex = sTokenIndex + (sLastField.length() - sToken.length()); + } } } } diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/parametermetadata/ParameterMetaDataTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/parametermetadata/ParameterMetaDataTest.java index bfc4215715..6419d21991 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/parametermetadata/ParameterMetaDataTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/parametermetadata/ParameterMetaDataTest.java @@ -52,7 +52,6 @@ public void testParameterMetaDataWrapper() throws SQLException { finally { Utils.dropTableIfExists(tableName, stmt); } - } } @@ -73,4 +72,27 @@ public void testSQLServerExceptionNotWrapped() throws SQLException { "SQLServerException should not be wrapped by another SQLServerException."); } } + + /** + * Test ParameterMetaData when parameter name contains braces + * + * @throws SQLException + */ + @Test + public void testNameWithBraces() throws SQLException { + try (Connection con = DriverManager.getConnection(connectionString); Statement stmt = con.createStatement()) { + + stmt.executeUpdate("create table " + tableName + " ([c1_varchar(max)] varchar(max))"); + try { + String query = "insert into " + tableName + " ([c1_varchar(max)]) values (?)"; + + try (PreparedStatement pstmt = con.prepareStatement(query)) { + pstmt.getParameterMetaData(); + } + } + finally { + Utils.dropTableIfExists(tableName, stmt); + } + } + } }