Skip to content

Commit 899f451

Browse files
authored
[PECO-2135] getColumns discrepancy with Databricks Driver (#609)
* column size and nullable col fixed
1 parent 1c96614 commit 899f451

File tree

2 files changed

+57
-12
lines changed

2 files changed

+57
-12
lines changed

src/main/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilder.java

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,6 @@ static List<List<Object>> getRows(ResultSet resultSet, List<ResultColumn> column
125125
} else {
126126
object = "NO";
127127
}
128-
} else if (column.getColumnName().equals(NULLABLE_COLUMN.getColumnName())) {
129-
if (object == null || object.equals("true")) {
130-
object = 1;
131-
} else {
132-
object = 0;
133-
}
134128
} else if (column.getColumnName().equals(DECIMAL_DIGITS_COLUMN.getColumnName())
135129
|| column.getColumnName().equals(NUM_PREC_RADIX_COLUMN.getColumnName())) {
136130
if (object == null) {
@@ -156,25 +150,33 @@ static List<List<Object>> getRows(ResultSet resultSet, List<ResultColumn> column
156150
object = null;
157151
}
158152
}
159-
153+
if (column.getColumnName().equals(NULLABLE_COLUMN.getColumnName())) {
154+
object = resultSet.getObject(IS_NULLABLE_COLUMN.getResultSetColumnName());
155+
if (object == null || object.equals("true")) {
156+
object = 1;
157+
} else {
158+
object = 0;
159+
}
160+
}
160161
if (column.getColumnName().equals(TABLE_TYPE_COLUMN.getColumnName())
161162
&& (object == null || object.equals(""))) {
162163
object = "TABLE";
163164
}
164165

165166
// Handle TYPE_NAME separately for potential modifications
166-
if (column.getColumnName().equals(TYPE_NAME_COLUMN.getColumnName())) {
167+
if (column.getColumnName().equals(COLUMN_TYPE_COLUMN.getColumnName())) {
167168
object = stripTypeName((String) object);
168169
}
169170
// Set COLUMN_SIZE to 255 if it's not present
170171
if (column.getColumnName().equals(COLUMN_SIZE_COLUMN.getColumnName())
171172
&& object == null) {
172173
// check if typeVal is a text related field
173174
String typeVal = resultSet.getString(COLUMN_TYPE_COLUMN.getResultSetColumnName());
174-
if (typeVal != null && isTextType(typeVal)) {
175-
object = 255;
176-
} else {
175+
if (typeVal == null) {
177176
object = 0;
177+
} else {
178+
int columnSize = getSizeFromTypeVal(typeVal);
179+
object = (columnSize != -1) ? columnSize : (isTextType(typeVal) ? 255 : 0);
178180
}
179181
}
180182

@@ -189,6 +191,34 @@ static List<List<Object>> getRows(ResultSet resultSet, List<ResultColumn> column
189191
return rows;
190192
}
191193

194+
/**
195+
* Extracts the size from a SQL type definition in the format DATA_TYPE(size).
196+
*
197+
* @param typeVal The SQL type string (e.g., "VARCHAR(5000)", "CHAR(100)").
198+
* @return The size as an integer, or -1 if the size cannot be determined.
199+
*/
200+
static int getSizeFromTypeVal(String typeVal) {
201+
if (typeVal.isEmpty()) {
202+
return -1; // Return -1 for invalid input
203+
}
204+
205+
// Regular expression to match DATA_TYPE(size) and extract the size
206+
String regex = "\\w+\\((\\d+)\\)";
207+
java.util.regex.Pattern pattern =
208+
java.util.regex.Pattern.compile(regex, java.util.regex.Pattern.CASE_INSENSITIVE);
209+
java.util.regex.Matcher matcher = pattern.matcher(typeVal);
210+
211+
if (matcher.find()) {
212+
try {
213+
return Integer.parseInt(matcher.group(1));
214+
} catch (NumberFormatException e) {
215+
return -1;
216+
}
217+
}
218+
219+
return -1;
220+
}
221+
192222
static int getBufferLength(String typeVal, int columnSize) {
193223
if (typeVal == null || typeVal.isEmpty()) {
194224
return 0;

src/test/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilderTest.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ private static Stream<Arguments> getBufferLengthArguments() {
110110
Arguments.of("TEXT", 10, 255));
111111
}
112112

113+
private static Stream<Arguments> getSizeFromTypeValArguments() {
114+
return Stream.of(
115+
Arguments.of("VARCHAR(100)", 100),
116+
Arguments.of("VARCHAR", -1),
117+
Arguments.of("char(10)", 10),
118+
Arguments.of("", -1));
119+
}
120+
113121
private static Stream<Arguments> getRowsTableTypeColumnArguments() {
114122
return Stream.of(
115123
Arguments.of("TABLE", "TABLE"),
@@ -143,7 +151,7 @@ void testGetRowsHandlesNullableColumn(String isNullableValue, int expectedNullab
143151
throws SQLException {
144152
ResultSet resultSet = mock(ResultSet.class);
145153
Mockito.when(resultSet.next()).thenReturn(true).thenReturn(false);
146-
Mockito.when(resultSet.getObject(NULLABLE_COLUMN.getResultSetColumnName()))
154+
Mockito.when(resultSet.getObject(IS_NULLABLE_COLUMN.getResultSetColumnName()))
147155
.thenReturn(isNullableValue);
148156

149157
List<List<Object>> rows = MetadataResultSetBuilder.getRows(resultSet, COLUMN_COLUMNS);
@@ -160,6 +168,13 @@ public void testGetBufferLength(String typeVal, int columnSize, int expected) {
160168
assertEquals(expected, actual);
161169
}
162170

171+
@ParameterizedTest
172+
@MethodSource("getSizeFromTypeValArguments")
173+
public void testGetSizeFromTypeVal(String typeVal, int expected) {
174+
int actual = MetadataResultSetBuilder.getSizeFromTypeVal(typeVal);
175+
assertEquals(expected, actual);
176+
}
177+
163178
@ParameterizedTest
164179
@MethodSource("stripTypeNameArguments")
165180
public void testStripTypeName(String input, String expected) {

0 commit comments

Comments
 (0)