This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch feat/add-db-engine-specs
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 47e3172da53807e259b73df255ebe3133b683c7a
Author: Evan Rusackas <[email protected]>
AuthorDate: Thu Feb 12 16:33:48 2026 -0800

    feat(db-engine-specs): add engine specs for PostGIS, DoltDB, TiDB, QuestDB, 
and Timeplus
    
    Add database engine specs with metadata and logos for five databases:
    
    - PostGIS: PostgreSQL-compatible spatial database extension
    - DoltDB: MySQL-compatible version-controlled database
    - TiDB: MySQL-compatible distributed HTAP database
    - QuestDB: High-performance time-series database
    - Timeplus: Streaming-first analytics platform
    
    Also fixes MSSQL's logo reference (msql.png → mssql-server.png).
    
    Co-Authored-By: Claude Opus 4.5 <[email protected]>
---
 superset-frontend/src/assets/images/doltdb.png   | Bin 0 -> 5838 bytes
 superset-frontend/src/assets/images/postgis.svg  | Bin 0 -> 94811 bytes
 superset-frontend/src/assets/images/questdb.png  | Bin 0 -> 53162 bytes
 superset-frontend/src/assets/images/tidb.svg     | Bin 0 -> 2139 bytes
 superset-frontend/src/assets/images/timeplus.svg | Bin 0 -> 9072 bytes
 superset/db_engine_specs/doltdb.py               |  49 +++++++++++++++
 superset/db_engine_specs/mssql.py                |   2 +-
 superset/db_engine_specs/postgis.py              |  53 ++++++++++++++++
 superset/db_engine_specs/questdb.py              |  62 +++++++++++++++++++
 superset/db_engine_specs/tidb.py                 |  74 +++++++++++++++++++++++
 superset/db_engine_specs/timeplus.py             |  63 +++++++++++++++++++
 11 files changed, 302 insertions(+), 1 deletion(-)

diff --git a/superset-frontend/src/assets/images/doltdb.png 
b/superset-frontend/src/assets/images/doltdb.png
new file mode 100644
index 00000000000..23740015101
Binary files /dev/null and b/superset-frontend/src/assets/images/doltdb.png 
differ
diff --git a/superset-frontend/src/assets/images/postgis.svg 
b/superset-frontend/src/assets/images/postgis.svg
new file mode 100644
index 00000000000..ea09e7f38cc
Binary files /dev/null and b/superset-frontend/src/assets/images/postgis.svg 
differ
diff --git a/superset-frontend/src/assets/images/questdb.png 
b/superset-frontend/src/assets/images/questdb.png
new file mode 100644
index 00000000000..fca78fcd463
Binary files /dev/null and b/superset-frontend/src/assets/images/questdb.png 
differ
diff --git a/superset-frontend/src/assets/images/tidb.svg 
b/superset-frontend/src/assets/images/tidb.svg
new file mode 100644
index 00000000000..50ddfe76084
Binary files /dev/null and b/superset-frontend/src/assets/images/tidb.svg differ
diff --git a/superset-frontend/src/assets/images/timeplus.svg 
b/superset-frontend/src/assets/images/timeplus.svg
new file mode 100644
index 00000000000..fc208f6ea91
Binary files /dev/null and b/superset-frontend/src/assets/images/timeplus.svg 
differ
diff --git a/superset/db_engine_specs/doltdb.py 
b/superset/db_engine_specs/doltdb.py
new file mode 100644
index 00000000000..e83b38b7094
--- /dev/null
+++ b/superset/db_engine_specs/doltdb.py
@@ -0,0 +1,49 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from superset.db_engine_specs.base import DatabaseCategory
+from superset.db_engine_specs.mysql import MySQLEngineSpec
+
+
+class DoltDBEngineSpec(MySQLEngineSpec):
+    """
+    Engine spec for DoltDB.
+
+    DoltDB is a SQL database with Git-like version control for data and schema.
+    It is fully MySQL-compatible.
+    """
+
+    engine = "doltdb"
+    engine_name = "DoltDB"
+
+    metadata = {
+        "description": (
+            "DoltDB is a SQL database with Git-like version control for data "
+            "and schema. It is fully MySQL-compatible."
+        ),
+        "logo": "doltdb.png",
+        "homepage_url": "https://www.dolthub.com/";,
+        "categories": [
+            DatabaseCategory.TRADITIONAL_RDBMS,
+            DatabaseCategory.OPEN_SOURCE,
+        ],
+        "pypi_packages": ["mysqlclient"],
+        "connection_string": 
"mysql://{username}:{password}@{host}:{port}/{database}",
+        "default_port": 3306,
+        "notes": (
+            "DoltDB uses the MySQL wire protocol. Connect using any MySQL 
driver."
+        ),
+    }
diff --git a/superset/db_engine_specs/mssql.py 
b/superset/db_engine_specs/mssql.py
index 3a8bdfa8dbe..dc47a92c770 100644
--- a/superset/db_engine_specs/mssql.py
+++ b/superset/db_engine_specs/mssql.py
@@ -57,7 +57,7 @@ class MssqlEngineSpec(BaseEngineSpec):
         "description": (
             "Microsoft SQL Server is a relational database management system."
         ),
-        "logo": "msql.png",
+        "logo": "mssql-server.png",
         "homepage_url": "https://www.microsoft.com/en-us/sql-server";,
         "categories": [
             DatabaseCategory.TRADITIONAL_RDBMS,
diff --git a/superset/db_engine_specs/postgis.py 
b/superset/db_engine_specs/postgis.py
new file mode 100644
index 00000000000..c02b95cd82c
--- /dev/null
+++ b/superset/db_engine_specs/postgis.py
@@ -0,0 +1,53 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from superset.db_engine_specs.base import DatabaseCategory
+from superset.db_engine_specs.postgres import PostgresBaseEngineSpec
+
+
+class PostGISEngineSpec(PostgresBaseEngineSpec):
+    """
+    Engine spec for PostGIS.
+
+    PostGIS is a spatial database extender for PostgreSQL, adding support for
+    geographic objects and location queries.
+    """
+
+    engine = "postgis"
+    engine_name = "PostGIS"
+    default_driver = "psycopg2"
+
+    metadata = {
+        "description": (
+            "PostGIS is a spatial database extender for PostgreSQL, adding "
+            "support for geographic objects and location queries."
+        ),
+        "logo": "postgis.svg",
+        "homepage_url": "https://postgis.net/";,
+        "categories": [
+            DatabaseCategory.TRADITIONAL_RDBMS,
+            DatabaseCategory.OPEN_SOURCE,
+        ],
+        "pypi_packages": ["psycopg2"],
+        "connection_string": (
+            "postgresql://{username}:{password}@{host}:{port}/{database}"
+        ),
+        "default_port": 5432,
+        "notes": (
+            "PostGIS extends PostgreSQL with geospatial capabilities. "
+            "Uses the standard PostgreSQL driver."
+        ),
+    }
diff --git a/superset/db_engine_specs/questdb.py 
b/superset/db_engine_specs/questdb.py
new file mode 100644
index 00000000000..ae7a6f492c3
--- /dev/null
+++ b/superset/db_engine_specs/questdb.py
@@ -0,0 +1,62 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from superset.constants import TimeGrain
+from superset.db_engine_specs.base import BaseEngineSpec, DatabaseCategory
+
+
+class QuestDBEngineSpec(BaseEngineSpec):
+    """
+    Engine spec for QuestDB.
+
+    QuestDB is a high-performance, open-source time-series database optimized
+    for fast ingest and SQL queries.
+    """
+
+    engine = "questdb"
+    engine_name = "QuestDB"
+    default_driver = "questdb"
+
+    metadata = {
+        "description": (
+            "QuestDB is a high-performance, open-source time-series database "
+            "optimized for fast ingest and SQL queries."
+        ),
+        "logo": "questdb.png",
+        "homepage_url": "https://questdb.io/";,
+        "categories": [
+            DatabaseCategory.ANALYTICAL_DATABASES,
+            DatabaseCategory.OPEN_SOURCE,
+        ],
+        "pypi_packages": ["questdb-connect"],
+        "connection_string": 
"questdb://{username}:{password}@{host}:{port}/{database}",
+        "default_port": 8812,
+        "notes": (
+            "QuestDB is optimized for time-series data. Install 
questdb-connect "
+            "for SQLAlchemy support."
+        ),
+    }
+
+    _time_grain_expressions = {
+        None: "{col}",
+        TimeGrain.SECOND: "timestamp_floor('s', {col})",
+        TimeGrain.MINUTE: "timestamp_floor('m', {col})",
+        TimeGrain.HOUR: "timestamp_floor('h', {col})",
+        TimeGrain.DAY: "timestamp_floor('d', {col})",
+        TimeGrain.WEEK: "timestamp_floor('w', {col})",
+        TimeGrain.MONTH: "timestamp_floor('M', {col})",
+        TimeGrain.YEAR: "timestamp_floor('y', {col})",
+    }
diff --git a/superset/db_engine_specs/tidb.py b/superset/db_engine_specs/tidb.py
new file mode 100644
index 00000000000..e913640d0eb
--- /dev/null
+++ b/superset/db_engine_specs/tidb.py
@@ -0,0 +1,74 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from superset.db_engine_specs.base import DatabaseCategory
+from superset.db_engine_specs.mysql import MySQLEngineSpec
+
+
+class TiDBEngineSpec(MySQLEngineSpec):
+    """
+    Engine spec for TiDB.
+
+    TiDB is an open-source, cloud-native, distributed SQL database designed for
+    hybrid transactional and analytical processing (HTAP) workloads. It is
+    MySQL-compatible.
+    """
+
+    engine = "tidb"
+    engine_name = "TiDB"
+
+    metadata = {
+        "description": (
+            "TiDB is an open-source, cloud-native, distributed SQL database "
+            "designed for hybrid transactional and analytical processing 
(HTAP) "
+            "workloads. It is MySQL-compatible."
+        ),
+        "logo": "tidb.svg",
+        "homepage_url": "https://www.pingcap.com/tidb/";,
+        "categories": [
+            DatabaseCategory.TRADITIONAL_RDBMS,
+            DatabaseCategory.OPEN_SOURCE,
+        ],
+        "pypi_packages": ["mysqlclient", "sqlalchemy-tidb"],
+        "connection_string": 
"mysql://{username}:{password}@{host}:{port}/{database}",
+        "default_port": 4000,
+        "drivers": [
+            {
+                "name": "mysqlclient",
+                "pypi_package": "mysqlclient",
+                "connection_string": (
+                    "mysql://{username}:{password}@{host}:{port}/{database}"
+                ),
+                "is_recommended": True,
+                "notes": (
+                    "Standard MySQL driver, works with TiDB's MySQL 
compatibility."
+                ),
+            },
+            {
+                "name": "tidb",
+                "pypi_package": "sqlalchemy-tidb",
+                "connection_string": (
+                    "tidb://{username}:{password}@{host}:{port}/{database}"
+                ),
+                "is_recommended": False,
+                "notes": "Native TiDB dialect with TiDB-specific 
optimizations.",
+            },
+        ],
+        "notes": (
+            "TiDB is MySQL-compatible. Use the standard MySQL driver or the "
+            "native sqlalchemy-tidb dialect."
+        ),
+    }
diff --git a/superset/db_engine_specs/timeplus.py 
b/superset/db_engine_specs/timeplus.py
new file mode 100644
index 00000000000..4aea3e29b3b
--- /dev/null
+++ b/superset/db_engine_specs/timeplus.py
@@ -0,0 +1,63 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from superset.constants import TimeGrain
+from superset.db_engine_specs.base import BaseEngineSpec, DatabaseCategory
+
+
+class TimeplusEngineSpec(BaseEngineSpec):
+    """
+    Engine spec for Timeplus.
+
+    Timeplus is a streaming-first analytics platform that provides real-time
+    data processing with SQL.
+    """
+
+    engine = "timeplus"
+    engine_name = "Timeplus"
+    default_driver = "timeplus"
+
+    metadata = {
+        "description": (
+            "Timeplus is a streaming-first analytics platform that provides "
+            "real-time data processing with SQL."
+        ),
+        "logo": "timeplus.svg",
+        "homepage_url": "https://www.timeplus.com/";,
+        "categories": [
+            DatabaseCategory.ANALYTICAL_DATABASES,
+            DatabaseCategory.OPEN_SOURCE,
+        ],
+        "pypi_packages": ["timeplus-connect"],
+        "connection_string": "timeplus://{username}:{password}@{host}:{port}",
+        "default_port": 8123,
+        "notes": (
+            "Timeplus provides real-time streaming SQL analytics. Install "
+            "timeplus-connect for SQLAlchemy and Superset support."
+        ),
+    }
+
+    _time_grain_expressions = {
+        None: "{col}",
+        TimeGrain.SECOND: "date_trunc('second', {col})",
+        TimeGrain.MINUTE: "date_trunc('minute', {col})",
+        TimeGrain.HOUR: "date_trunc('hour', {col})",
+        TimeGrain.DAY: "date_trunc('day', {col})",
+        TimeGrain.WEEK: "date_trunc('week', {col})",
+        TimeGrain.MONTH: "date_trunc('month', {col})",
+        TimeGrain.QUARTER: "date_trunc('quarter', {col})",
+        TimeGrain.YEAR: "date_trunc('year', {col})",
+    }

Reply via email to