Skip to content

Commit 368cc05

Browse files
authored
Adds fix for string handling with whitespaces (#758)
* add fix * add fix plus * fmt * removes trim
1 parent 9a68ad2 commit 368cc05

File tree

4 files changed

+80
-14
lines changed

4 files changed

+80
-14
lines changed

src/main/java/com/databricks/jdbc/api/impl/DatabricksResultSet.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,9 +1806,6 @@ private <T> T getConvertedObject(
18061806
if (obj == null) {
18071807
return defaultValue.get();
18081808
}
1809-
if (obj instanceof String) {
1810-
obj = removeExtraQuotes((String) obj);
1811-
}
18121809
int columnType = resultSetMetaData.getColumnType(columnIndex);
18131810
ObjectConverter converter = ConverterHelper.getConverterForSqlType(columnType);
18141811
return convertMethod.apply(converter, obj);
@@ -1827,14 +1824,6 @@ private BigDecimal applyScaleToBigDecimal(BigDecimal bigDecimal, int columnIndex
18271824
return bigDecimal.setScale(scale, RoundingMode.HALF_UP);
18281825
}
18291826

1830-
private String removeExtraQuotes(String str) {
1831-
str = str.trim();
1832-
if (str.startsWith("\"") && str.endsWith("\"") && str.length() > 1) {
1833-
str = str.substring(1, str.length() - 1).trim();
1834-
}
1835-
return str;
1836-
}
1837-
18381827
@Override
18391828
public String toString() {
18401829
return (new ToStringer(DatabricksResultSet.class))

src/main/java/com/databricks/jdbc/api/impl/converters/StringConverter.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.databricks.jdbc.api.impl.converters;
22

3+
import com.databricks.jdbc.exception.DatabricksParsingException;
34
import com.databricks.jdbc.exception.DatabricksSQLException;
45
import com.databricks.jdbc.exception.DatabricksValidationException;
6+
import com.databricks.jdbc.model.telemetry.enums.DatabricksDriverErrorCode;
57
import java.math.BigDecimal;
68
import java.math.BigInteger;
79
import java.sql.Date;
810
import java.sql.Timestamp;
11+
import java.text.ParseException;
12+
import java.text.SimpleDateFormat;
913

1014
public class StringConverter implements ObjectConverter {
1115
@Override
@@ -110,11 +114,38 @@ public char toChar(Object object) throws DatabricksSQLException {
110114

111115
@Override
112116
public Date toDate(Object object) throws DatabricksSQLException {
113-
return Date.valueOf(toString(object));
117+
return Date.valueOf(removeExtraQuotes(toString(object)));
114118
}
115119

116120
@Override
117121
public Timestamp toTimestamp(Object object) throws DatabricksSQLException {
118-
return Timestamp.valueOf(toString(object));
122+
String timestampStr = removeExtraQuotes(toString(object));
123+
124+
try {
125+
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSXXX");
126+
java.util.Date parsedDate = dateFormat.parse(timestampStr);
127+
return new Timestamp(parsedDate.getTime());
128+
} catch (ParseException e) {
129+
try {
130+
SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssXXX");
131+
java.util.Date parsedDate = simpleFormat.parse(timestampStr);
132+
return new Timestamp(parsedDate.getTime());
133+
} catch (ParseException e2) {
134+
try {
135+
return Timestamp.valueOf(timestampStr);
136+
} catch (IllegalArgumentException ex) {
137+
throw new DatabricksParsingException(
138+
"Invalid timestamp format: " + timestampStr,
139+
DatabricksDriverErrorCode.JSON_PARSING_ERROR);
140+
}
141+
}
142+
}
143+
}
144+
145+
private String removeExtraQuotes(String str) {
146+
if (str.startsWith("\"") && str.endsWith("\"") && str.length() > 1) {
147+
str = str.substring(1, str.length() - 1);
148+
}
149+
return str;
119150
}
120151
}

src/test/java/com/databricks/jdbc/api/impl/DatabricksResultSetTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,36 @@ void testGetStringAndWasNull() throws SQLException {
144144
assertEquals("test", resultSet.getString("columnLabel"));
145145
}
146146

147+
@Test
148+
void testGetStringWithWhiteSpaces() throws SQLException {
149+
when(mockedExecutionResult.getObject(0)).thenReturn(null);
150+
DatabricksResultSet resultSet = getResultSet(StatementState.PENDING, null);
151+
assertNull(resultSet.getString(1));
152+
assertTrue(resultSet.wasNull());
153+
when(mockedExecutionResult.getObject(0)).thenReturn(" test ");
154+
when(mockedResultSetMetadata.getColumnType(1)).thenReturn(Types.VARCHAR);
155+
assertEquals(" test ", resultSet.getString(1));
156+
assertFalse(resultSet.wasNull());
157+
// Test with column label
158+
when(mockedResultSetMetadata.getColumnNameIndex("columnLabel")).thenReturn(1);
159+
assertEquals(" test ", resultSet.getString("columnLabel"));
160+
}
161+
162+
@Test
163+
void testGetStringWithQuotes() throws SQLException {
164+
when(mockedExecutionResult.getObject(0)).thenReturn(null);
165+
DatabricksResultSet resultSet = getResultSet(StatementState.PENDING, null);
166+
assertNull(resultSet.getString(1));
167+
assertTrue(resultSet.wasNull());
168+
when(mockedExecutionResult.getObject(0)).thenReturn("\"test\"");
169+
when(mockedResultSetMetadata.getColumnType(1)).thenReturn(Types.VARCHAR);
170+
assertEquals("\"test\"", resultSet.getString(1));
171+
assertFalse(resultSet.wasNull());
172+
// Test with column label
173+
when(mockedResultSetMetadata.getColumnNameIndex("columnLabel")).thenReturn(1);
174+
assertEquals("\"test\"", resultSet.getString("columnLabel"));
175+
}
176+
147177
@Test
148178
void testGetBoolean() throws SQLException {
149179
DatabricksResultSet resultSet = getResultSet(StatementState.SUCCEEDED, null);

src/test/java/com/databricks/jdbc/api/impl/converters/StringConverterTest.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.math.BigDecimal;
88
import java.sql.Date;
99
import java.sql.Timestamp;
10+
import java.text.ParseException;
11+
import java.text.SimpleDateFormat;
1012
import org.junit.jupiter.api.Test;
1113

1214
public class StringConverterTest {
@@ -15,8 +17,14 @@ public class StringConverterTest {
1517
private final String NUMBERICAL_ZERO_STRING = "0";
1618
private final String CHARACTER_STRING = "ABC";
1719
private final String TIME_STAMP_STRING = "2023-09-10 00:00:00";
20+
21+
private final String ALT_TIMESTAMP_STRING = "2025-03-18 12:08:31.552223-07:00";
22+
private final String ALT_TIMESTAMP_STRING_WITH_EXTRA_QUOTES =
23+
"\"2025-03-18 12:08:31.552223-07:00\"";
1824
private final String DATE_STRING = "2023-09-10";
1925

26+
private final String DATE_STRING_WITH_EXTRA_QUOTES = "\"2023-09-10\"";
27+
2028
@Test
2129
public void testConvertToByte() throws DatabricksSQLException {
2230
String singleCharacterString = "A";
@@ -155,14 +163,22 @@ public void testConvertToString() throws DatabricksSQLException {
155163
}
156164

157165
@Test
158-
public void testConvertToTimestamp() throws DatabricksSQLException {
166+
public void testConvertToTimestamp() throws DatabricksSQLException, ParseException {
159167
assertEquals(
160168
new StringConverter().toTimestamp(TIME_STAMP_STRING), Timestamp.valueOf(TIME_STAMP_STRING));
169+
assertEquals(
170+
new StringConverter().toTimestamp(ALT_TIMESTAMP_STRING_WITH_EXTRA_QUOTES),
171+
new Timestamp(
172+
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSXXX")
173+
.parse(ALT_TIMESTAMP_STRING)
174+
.getTime()));
161175
}
162176

163177
@Test
164178
public void testConvertToDate() throws DatabricksSQLException {
165179
assertEquals(new StringConverter().toDate(DATE_STRING), Date.valueOf(DATE_STRING));
180+
assertEquals(
181+
new StringConverter().toDate(DATE_STRING_WITH_EXTRA_QUOTES), Date.valueOf(DATE_STRING));
166182
}
167183

168184
@Test

0 commit comments

Comments
 (0)