Skip to content

Commit dfaa8e1

Browse files
committed
Resolved merge conflict
2 parents 5c78367 + 5c985c8 commit dfaa8e1

18 files changed

Lines changed: 358 additions & 120 deletions
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
name: Enforce Release Freeze
2+
3+
on:
4+
pull_request:
5+
branches: [main]
6+
7+
jobs:
8+
freeze-check:
9+
runs-on: ubuntu-latest
10+
11+
steps:
12+
- name: Check out repository
13+
uses: actions/checkout@v4
14+
15+
- name: Set up jq
16+
run: sudo apt-get update && sudo apt-get install -y jq
17+
18+
- name: Enforce branch freeze logic
19+
shell: bash
20+
env:
21+
# GITHUB_HEAD_REF: Source branch name for PRs
22+
PR_BRANCH: ${{ github.head_ref }}
23+
run: |
24+
CONFIG_FILE="development/.release-config.json"
25+
26+
if [[ ! -f "$CONFIG_FILE" ]]; then
27+
echo "✅ No release config file - passing check."
28+
exit 0
29+
fi
30+
31+
FREEZE=$(jq '.freeze' "$CONFIG_FILE")
32+
33+
if [[ "$FREEZE" != "true" ]]; then
34+
echo "✅ Freeze is off - passing check."
35+
exit 0
36+
fi
37+
38+
ALLOW_LIST=( $(jq -r '.allow_list[]' "$CONFIG_FILE") )
39+
40+
BRANCH="$PR_BRANCH"
41+
ALLOWED=0
42+
43+
# Check for exact branch name in allow_list
44+
for ENTRY in $(jq -r '.allow_list[]' "$CONFIG_FILE"); do
45+
if [[ "$BRANCH" == "$ENTRY" ]]; then
46+
ALLOWED=1
47+
break
48+
fi
49+
done
50+
51+
if [[ "$ALLOWED" == "1" ]]; then
52+
echo "✅ Branch '$BRANCH' is in allow_list. Passing check."
53+
exit 0
54+
else
55+
echo "❌ Release freeze is ACTIVE!"
56+
REASON=$(jq -r '.reason' "$CONFIG_FILE")
57+
echo "Reason: $REASON"
58+
echo "Branch '$BRANCH' is NOT permitted to merge under current freeze rules."
59+
exit 1
60+
fi

development/.release-freeze.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"freeze": false,
3+
"reason": "Release description",
4+
"allow_list": []
5+
}

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

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.databricks.jdbc.api.internal.IDatabricksSession;
1010
import com.databricks.jdbc.common.*;
1111
import com.databricks.jdbc.common.util.DriverUtil;
12-
import com.databricks.jdbc.common.util.JdbcThreadUtils;
1312
import com.databricks.jdbc.dbclient.impl.common.MetadataResultSetBuilder;
1413
import com.databricks.jdbc.dbclient.impl.common.StatementId;
1514
import com.databricks.jdbc.exception.DatabricksSQLException;
@@ -20,8 +19,6 @@
2019
import com.databricks.sdk.service.sql.StatementState;
2120
import java.sql.*;
2221
import java.util.*;
23-
import java.util.concurrent.ExecutorService;
24-
import java.util.concurrent.Executors;
2522

2623
public class DatabricksDatabaseMetaData implements DatabaseMetaData {
2724

@@ -40,9 +37,6 @@ public class DatabricksDatabaseMetaData implements DatabaseMetaData {
4037
public static final String SYSTEM_FUNCTIONS = "DATABASE,IFNULL,USER";
4138
public static final String TIME_DATE_FUNCTIONS =
4239
"CURDATE,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURTIME,DAYNAME,DAYOFMONTH,DAYOFWEEK,DAYOFYEAR,HOUR,MINUTE,MONTH,MONTHNAME,NOW,QUARTER,SECOND,TIMESTAMPADD,TIMESTAMPDIFF,WEEK,YEAR";
43-
private static final Object THREAD_POOL_LOCK = new Object();
44-
private static ExecutorService schemasThreadPool = null;
45-
private static final int DEFAULT_MAX_THREADS = 10;
4640
private final IDatabricksConnectionInternal connection;
4741
private final IDatabricksSession session;
4842
private final MetadataResultSetBuilder metadataResultSetBuilder;
@@ -1505,48 +1499,6 @@ public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLExce
15051499
catalog, schemaPattern);
15061500
throwExceptionIfConnectionIsClosed();
15071501

1508-
if (session.getConnectionContext().getClientType() == DatabricksClientType.SEA
1509-
&& (catalog == null || catalog.equals("*") || catalog.equals("%"))) {
1510-
// Fetch catalogs from the metadata client
1511-
List<String> catalogList = new ArrayList<>();
1512-
try (ResultSet catalogs = getCatalogs()) {
1513-
while (catalogs.next()) {
1514-
String c = catalogs.getString(1);
1515-
if (c != null && !c.isEmpty()) {
1516-
catalogList.add(c);
1517-
}
1518-
}
1519-
}
1520-
1521-
// Process catalogs in parallel, gathering schema information
1522-
List<List<Object>> schemaRows =
1523-
JdbcThreadUtils.parallelFlatMap(
1524-
catalogList,
1525-
session.getConnectionContext(),
1526-
DEFAULT_MAX_THREADS, // Not significant since the executor is provided as a parameter
1527-
90, // 90 seconds timeout
1528-
c -> {
1529-
List<List<Object>> rows = new ArrayList<>();
1530-
try (ResultSet catalogSchemas =
1531-
session.getDatabricksMetadataClient().listSchemas(session, c, schemaPattern)) {
1532-
while (catalogSchemas.next()) {
1533-
List<Object> schemaRow = new ArrayList<>();
1534-
schemaRow.add(catalogSchemas.getString(1)); // TABLE_SCHEM
1535-
schemaRow.add(catalogSchemas.getString(2)); // TABLE_CATALOG
1536-
rows.add(schemaRow);
1537-
}
1538-
} catch (SQLException e) {
1539-
LOGGER.warn("Error fetching schemas for catalog %s %s", c, e.getMessage());
1540-
}
1541-
return rows;
1542-
},
1543-
getOrCreateSchemasThreadPool());
1544-
1545-
// Convert combined data into a result set
1546-
return metadataResultSetBuilder.getResultSetWithGivenRowsAndColumns(
1547-
SCHEMA_COLUMNS, schemaRows, METADATA_STATEMENT_ID, CommandName.LIST_SCHEMAS);
1548-
}
1549-
15501502
return session.getDatabricksMetadataClient().listSchemas(session, catalog, schemaPattern);
15511503
}
15521504

@@ -1659,23 +1611,6 @@ public boolean isWrapperFor(Class<?> iface) throws SQLException {
16591611
return iface != null && iface.isAssignableFrom(this.getClass());
16601612
}
16611613

1662-
private static ExecutorService getOrCreateSchemasThreadPool() {
1663-
synchronized (THREAD_POOL_LOCK) {
1664-
if (schemasThreadPool == null || schemasThreadPool.isShutdown()) {
1665-
// Could read max threads from a configuration property
1666-
schemasThreadPool =
1667-
Executors.newFixedThreadPool(
1668-
DEFAULT_MAX_THREADS,
1669-
r -> {
1670-
Thread t = new Thread(r, "jdbc-schemas-fetcher");
1671-
t.setDaemon(true);
1672-
return t;
1673-
});
1674-
}
1675-
return schemasThreadPool;
1676-
}
1677-
}
1678-
16791614
private void throwExceptionIfConnectionIsClosed() throws SQLException {
16801615
LOGGER.debug("private void throwExceptionIfConnectionIsClosed()");
16811616
if (!connection.getSession().isOpen()) {

src/main/java/com/databricks/jdbc/common/MetadataResultConstants.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ public class MetadataResultConstants {
1313
public static final String[] DEFAULT_TABLE_TYPES = {"TABLE", "VIEW", "SYSTEM TABLE"};
1414
public static final ResultColumn CATALOG_COLUMN =
1515
new ResultColumn("TABLE_CAT", "catalogName", Types.VARCHAR);
16-
private static final ResultColumn CATALOG_FULL_COLUMN =
16+
public static final ResultColumn CATALOG_FULL_COLUMN =
1717
new ResultColumn("TABLE_CATALOG", "catalogName", Types.VARCHAR);
18-
public static final ResultColumn CATALOG_COLUMN_FOR_GET_CATALOGS =
18+
public static final ResultColumn CATALOG_RESULT_COLUMN =
1919
new ResultColumn("TABLE_CAT", "catalog", Types.VARCHAR);
2020
public static final ResultColumn TYPE_CATALOG_COLUMN =
2121
new ResultColumn("TYPE_CAT", "TYPE_CATALOG_COLUMN", Types.VARCHAR);
@@ -216,7 +216,7 @@ public class MetadataResultConstants {
216216
IS_AUTO_INCREMENT_COLUMN,
217217
IS_GENERATED_COLUMN);
218218

219-
public static List<ResultColumn> CATALOG_COLUMNS = List.of(CATALOG_COLUMN_FOR_GET_CATALOGS);
219+
public static List<ResultColumn> CATALOG_COLUMNS = List.of(CATALOG_RESULT_COLUMN);
220220

221221
public static List<ResultColumn> SCHEMA_COLUMNS =
222222
List.of(SCHEMA_COLUMN_FOR_GET_SCHEMA, CATALOG_FULL_COLUMN);
@@ -491,9 +491,7 @@ public class MetadataResultConstants {
491491
MetadataResultConstants.TYPE_NAME_COLUMN,
492492
MetadataResultConstants.DATA_TYPE_COLUMN,
493493
MetadataResultConstants.PRECISION_COLUMN));
494-
put(
495-
CommandName.LIST_CATALOGS,
496-
List.of(MetadataResultConstants.CATALOG_COLUMN_FOR_GET_CATALOGS));
494+
put(CommandName.LIST_CATALOGS, List.of(MetadataResultConstants.CATALOG_RESULT_COLUMN));
497495
put(
498496
CommandName.LIST_TABLES,
499497
List.of(MetadataResultConstants.TABLE_NAME_COLUMN, TABLE_TYPE_COLUMN));

src/main/java/com/databricks/jdbc/common/util/LoggingUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public static void setupLogger(String logDir, int logFileSizeMB, int logFileCoun
1919
throws IOException {
2020
if (LOGGER instanceof JulLogger && System.getProperty(JAVA_UTIL_LOGGING_CONFIG_FILE) == null) {
2121
// Only configure JUL logger if it's not already configured via external properties file
22-
LOGGER.info("Setting up JUL logger");
2322
JulLogger.initLogger(toJulLevel(level), logDir, logFileSizeMB * 1024 * 1024, logFileCount);
23+
LOGGER.info("Setting up JUL logger");
2424
}
2525
}
2626

src/main/java/com/databricks/jdbc/common/util/WildcardUtil.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public static boolean isNullOrEmpty(String s) {
2121
return s == null || s.trim().isEmpty();
2222
}
2323

24+
public static boolean isNullOrWildcard(String s) {
25+
return s == null || isWildcard(s) || s.equals("%");
26+
}
27+
2428
/**
2529
* This function checks if the input string is a wildcard string
2630
*

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.net.ServerSocket;
2727
import java.nio.file.Path;
2828
import java.nio.file.Paths;
29+
import java.time.Duration;
2930
import java.util.ArrayList;
3031
import java.util.Arrays;
3132
import java.util.List;
@@ -196,6 +197,8 @@ public void setupU2MConfig() throws DatabricksParsingException {
196197
.setAuthType(DatabricksJdbcConstants.U2M_AUTH_TYPE)
197198
.setHost(host)
198199
.setClientId(clientId)
200+
.setOAuthBrowserAuthTimeout(
201+
Duration.ofHours(1)) // TODO : add a browser timeout connection config
199202
.setClientSecret(connectionContext.getClientSecret())
200203
.setOAuthRedirectUrl(redirectUrl);
201204

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ public class CommandConstants {
1111
public static final String IN_CATALOG_SQL = " IN CATALOG %s";
1212
public static final String IN_ABSOLUTE_SCHEMA_SQL = " IN SCHEMA %s";
1313
public static final String IN_ABSOLUTE_TABLE_SQL = " IN TABLE %s";
14-
public static final String SHOW_SCHEMA_IN_CATALOG_SQL = "SHOW SCHEMAS IN %s";
14+
public static final String IN_ALL_CATALOGS_SQL = " IN ALL CATALOGS";
15+
public static final String SHOW_SCHEMAS_IN_CATALOG_SQL = "SHOW SCHEMAS IN %s";
1516
public static final String LIKE_SQL = " LIKE '%s'";
1617
public static final String SCHEMA_LIKE_SQL = " SCHEMA" + LIKE_SQL;
1718
public static final String TABLE_LIKE_SQL = " TABLE" + LIKE_SQL;
1819
public static final String SHOW_TABLES_SQL = "SHOW TABLES" + IN_CATALOG_SQL;
19-
public static final String SHOW_TABLES_IN_ALL_CATALOGS_SQL = "SHOW TABLES IN ALL CATALOGS";
20+
public static final String SHOW_TABLES_IN_ALL_CATALOGS_SQL = "SHOW TABLES" + IN_ALL_CATALOGS_SQL;
2021
public static final String SHOW_COLUMNS_SQL = "SHOW COLUMNS" + IN_CATALOG_SQL;
2122
public static final String SHOW_FUNCTIONS_SQL = "SHOW FUNCTIONS" + IN_CATALOG_SQL;
23+
public static final String SHOW_SCHEMAS_IN_ALL_CATALOGS_SQL =
24+
"SHOW SCHEMAS" + IN_ALL_CATALOGS_SQL;
2225
public static final String SHOW_PRIMARY_KEYS_SQL =
2326
"SHOW KEYS" + IN_CATALOG_SQL + IN_ABSOLUTE_SCHEMA_SQL + IN_ABSOLUTE_TABLE_SQL;
2427
public static final String SHOW_FOREIGN_KEYS_SQL =

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

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ public DatabricksResultSet getCatalogsResult(DatabricksResultSet resultSet) thro
6868

6969
public DatabricksResultSet getSchemasResult(DatabricksResultSet resultSet, String catalog)
7070
throws SQLException {
71-
List<List<Object>> rows = getRowsForSchemas(resultSet, SCHEMA_COLUMNS, catalog);
71+
List<List<Object>> rows =
72+
getRowsForSchemas(
73+
resultSet, SCHEMA_COLUMNS, catalog, new SchemasDatabricksResultSetAdapter());
7274
return buildResultSet(
7375
SCHEMA_COLUMNS,
7476
rows,
@@ -562,19 +564,39 @@ private List<List<Object>> getRowsForFunctions(
562564
}
563565

564566
private List<List<Object>> getRowsForSchemas(
565-
DatabricksResultSet resultSet, List<ResultColumn> columns, String catalog)
567+
DatabricksResultSet resultSet,
568+
List<ResultColumn> columns,
569+
String catalog,
570+
IDatabricksResultSetAdapter adapter)
566571
throws SQLException {
567572
List<List<Object>> rows = new ArrayList<>();
568573
while (resultSet.next()) {
574+
// Check if this row should be included based on the adapter's filter
575+
if (!adapter.includeRow(resultSet, columns)) {
576+
continue;
577+
}
578+
569579
List<Object> row = new ArrayList<>();
570580
for (ResultColumn column : columns) {
571-
if (column.getColumnName().equals("TABLE_CATALOG")) {
572-
row.add(catalog);
573-
continue;
581+
// Map the expected column on client to column in the result set using the adapter
582+
ResultColumn mappedColumn = adapter.mapColumn(column);
583+
584+
if (mappedColumn
585+
.getResultSetColumnName()
586+
.equals(CATALOG_RESULT_COLUMN.getResultSetColumnName())) {
587+
try {
588+
resultSet.findColumn(mappedColumn.getResultSetColumnName());
589+
} catch (SQLException e) {
590+
// Result set does not have a catalog column
591+
// Manually add the catalog and move to next column
592+
row.add(catalog);
593+
continue;
594+
}
574595
}
596+
575597
Object object;
576598
try {
577-
object = resultSet.getObject(column.getResultSetColumnName());
599+
object = resultSet.getObject(mappedColumn.getResultSetColumnName());
578600
if (object == null) {
579601
object = NULL_STRING;
580602
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.databricks.jdbc.dbclient.impl.common;
2+
3+
import static com.databricks.jdbc.common.MetadataResultConstants.CATALOG_FULL_COLUMN;
4+
import static com.databricks.jdbc.common.MetadataResultConstants.CATALOG_RESULT_COLUMN;
5+
6+
import com.databricks.jdbc.model.core.ResultColumn;
7+
import java.sql.ResultSet;
8+
import java.sql.SQLException;
9+
import java.util.List;
10+
11+
public class SchemasDatabricksResultSetAdapter implements IDatabricksResultSetAdapter {
12+
@Override
13+
public ResultColumn mapColumn(ResultColumn column) {
14+
String columnName = column.getResultSetColumnName();
15+
if (columnName.equals(CATALOG_FULL_COLUMN.getResultSetColumnName())) {
16+
// Map CATALOG_FULL_COLUMN to CATALOG_COLUMN_FOR_GET_CATALOGS of result set
17+
return CATALOG_RESULT_COLUMN;
18+
} else {
19+
return column;
20+
}
21+
}
22+
23+
@Override
24+
public boolean includeRow(ResultSet resultSet, List<ResultColumn> columns) throws SQLException {
25+
return true;
26+
}
27+
}

0 commit comments

Comments
 (0)