Skip to content

Commit 3c457a6

Browse files
authored
Add ADBC DB-API engine for SQL connections (#7664)
Closes #7549. ### What - Adds `AdbcDBAPIEngine` (`marimo/_sql/engines/adbc.py`) to support Arrow ADBC **DB-API wrapper** connections as first-class SQL engines. - Uses `cursor.fetch_arrow_table()` for Arrow-native result fetching and converts via existing `convert_to_output`. - Implements catalog discovery via `adbc_get_objects()` / `adbc_get_table_schema()` and respects `include_schemas` / `include_tables` / `include_table_details` via `depth` + filters. - Adds dialect inference from `adbc_get_info()` (cached), attempting to derive dialect from vendor name. ### Tests - `hatch run lint` - `hatch run format --check` - `hatch run typecheck:check` - `hatch run typos -w` - `hatch run +py=3.12 test:test tests/_sql/test_adbc.py` - `hatch run +py=3.12 test-optional:test tests/_sql/test_adbc.py` ### Notes - Integration tests for the SQLite ADBC driver are gated behind `pytest.importorskip` and run in `test-optional` (adds `adbc_driver_manager` + `adbc_driver_sqlite` there). --------- Co-authored-by: corleyma <2080732+corleyma@users.noreply.github.com>
1 parent ea749af commit 3c457a6

File tree

14 files changed

+1472
-9
lines changed

14 files changed

+1472
-9
lines changed

frontend/src/components/databases/display.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export function dbDisplayName(name: string) {
1515
case "mariadb":
1616
return "MariaDB";
1717
case "mssql":
18+
case "microsoft sql server":
1819
return "Microsoft SQL Server";
1920
case "oracle":
2021
return "Oracle";

frontend/src/components/datasources/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ function getFormatter(dialect: string): SqlCodeFormatter {
4747
}
4848
case "mssql":
4949
case "sqlserver":
50+
case "microsoft sql server":
5051
return {
5152
formatTableName: defaultFormatter.formatTableName,
5253
formatSelectClause: (columnName: string, tableName: string) =>
@@ -86,6 +87,8 @@ function getFormatter(dialect: string): SqlCodeFormatter {
8687
case "spark":
8788
case "trino":
8889
case "singlestoredb":
90+
case "databricks":
91+
case "datafusion":
8992
return defaultFormatter;
9093
default:
9194
logNever(dialect);

frontend/src/core/codemirror/format.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ async function getSqlFormatterDialect(
195195
return duckdb;
196196
case "mssql":
197197
case "sqlserver":
198+
case "microsoft sql server":
198199
return transactsql;
199200
case "athena":
200201
case "awsathena":
@@ -203,7 +204,10 @@ async function getSqlFormatterDialect(
203204
case "flink":
204205
case "mongodb":
205206
case "timescaledb":
207+
case "datafusion":
206208
return sql;
209+
case "databricks":
210+
return spark;
207211
default:
208212
logNever(sqlDialect);
209213
return defaultDialect;

frontend/src/core/codemirror/language/languages/sql/sql.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ function connectionNameToParserDialect(
373373
return "Sqlite";
374374
case "mssql":
375375
case "sqlserver":
376+
case "microsoft sql server":
376377
return "TransactSQL";
377378
case "duckdb":
378379
return "DuckDB";
@@ -404,6 +405,8 @@ function connectionNameToParserDialect(
404405
case "tidb":
405406
case "singlestoredb":
406407
case "spark":
408+
case "databricks":
409+
case "datafusion":
407410
Logger.debug("Unsupported dialect", { dialect });
408411
return null;
409412
default:

frontend/src/core/codemirror/language/languages/sql/utils.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ const KNOWN_DIALECTS_ARRAY = [
4949
"oracledb",
5050
"singlestoredb",
5151
"timescaledb",
52+
"databricks",
53+
"datafusion",
54+
"microsoft sql server",
5255
] as const;
5356
const KNOWN_DIALECTS: ReadonlySet<string> = new Set(KNOWN_DIALECTS_ARRAY);
5457
type KnownDialect = (typeof KNOWN_DIALECTS_ARRAY)[number];
@@ -80,6 +83,7 @@ export function guessDialect(
8083
return SQLite;
8184
case "mssql":
8285
case "sqlserver":
86+
case "microsoft sql server":
8387
return MSSQL;
8488
case "duckdb":
8589
return DuckDBDialect;
@@ -109,6 +113,8 @@ export function guessDialect(
109113
case "tidb":
110114
case "singlestoredb":
111115
case "spark":
116+
case "databricks":
117+
case "datafusion":
112118
Logger.debug("Unsupported dialect", { dialect });
113119
return ModifiedStandardSQL;
114120
default:

0 commit comments

Comments
 (0)