Skip to content

External plugin host support gaps found while building a DM / Dameng driver #316

Description

@haos666

Context

Hi! We have been building a third-party DM / Dameng database driver as a Tabularis external plugin: https://github.com/haos666/tabularis-dameng-plugin

The plugin has reached a plugin-side v1.0.0 baseline: https://github.com/haos666/tabularis-dameng-plugin/releases/tag/v1.0.0

It is implemented as a standalone Java process using Tabularis' JSON-RPC-over-stdin/stdout plugin contract. The Dameng JDBC driver is provided locally by the user and is not redistributed by the plugin.

The plugin side currently implements and validates:

  • connect / ping / schemas / tables / columns
  • indexes / foreign keys / schema snapshot / batch metadata
  • views and view definitions
  • routines and routine parameters
  • triggers and trigger definitions, plus plugin-side create/drop trigger RPCs
  • explain plans
  • SQL execution for SELECT, DML, and DDL
  • row editing CRUD
  • DDL preview helpers
  • execute_query_batch
  • BLOB/CLOB handling, including a Tabularis-compatible BLOB wire format

We have validated it with:

  • a local Docker DM instance
  • direct JSON-RPC protocol smoke tests
  • the Tabularis UI
  • the Tabularis MCP connection path

While doing this, we found a few host-side gaps where the external plugin contract or host forwarding does not yet expose capabilities that the plugin can already provide. We would like to help with PRs, but wanted to open an issue first to align on scope and sequencing.

Gaps found

1. Manifest schema and plugin guide are slightly behind runtime capabilities

The TypeScript runtime model and UI already use capabilities.triggers, but plugins/manifest.schema.json does not declare it yet.

Also, plugins/PLUGIN_GUIDE.md still shows older column metadata field names in at least one example:

  • column_default
  • is_primary_key

The current runtime model appears to consume:

  • default_value
  • is_pk

The guide also does not currently document the trigger RPCs used by the UI.

2. SQL dump/import does not support external plugin drivers

When using the SQL/database import flow with an external plugin connection, Tabularis currently returns Unsupported driver. In src-tauri/src/dump_commands.rs, import/export paths appear to dispatch only built-in drivers such as MySQL, PostgreSQL, and SQLite.

For the DM plugin, this means a valid schema script can be executed through database-native tooling or plugin SQL execution paths, but not through Tabularis' import UI.

3. External plugin batch execution is implemented plugin-side but not fully host-forwarded

The DM plugin implements execute_query_batch and verifies it directly through JSON-RPC. This is useful for multi-statement scripts because the plugin can execute all statements on the same JDBC connection and return per-statement results.

The host external plugin driver would need to forward batch execution to the plugin when available, with a graceful fallback for plugins that do not implement it.

4. Oracle-like SQL block splitting

DM trigger/function/procedure DDL commonly uses Oracle-like blocks such as:

CREATE OR REPLACE TRIGGER ...
BEGIN
  ...
END;
/

If the host SQL splitter splits inside these blocks, the plugin receives incomplete statements. This affects DM and would likely also affect Oracle-like external plugins.

5. BLOB preview/export hooks for external plugins

Tabularis has host-side BLOB preview/export hooks for built-in drivers. For external plugins, forwarding equivalent RPCs such as save_blob_to_file and fetch_blob_as_data_url would allow full UI parity.

Suggested PR sequencing

To keep reviews manageable, we are thinking of a small number of focused PRs rather than one large DM-specific change:

PR 1: External plugin contract/docs alignment

  • Add capabilities.triggers to plugins/manifest.schema.json
  • Update PLUGIN_GUIDE.md column metadata examples to current runtime field names
  • Document trigger RPCs used by the UI

This is documentation/schema alignment only and should not change runtime behavior.

PR 2: External plugin execution/import support

  • Forward execute_query_batch to external plugins when implemented
  • Use external plugin execution for SQL import instead of returning Unsupported driver
  • Improve Oracle-like block splitting for CREATE FUNCTION, CREATE PROCEDURE, and CREATE TRIGGER blocks

This would let external plugins run real initialization scripts through Tabularis.

PR 3: External plugin BLOB UI hooks

  • Forward BLOB preview/export RPCs to external plugins
  • Preserve existing built-in driver behavior

Goal

We are not asking Tabularis to add a built-in Dameng driver. The DM driver is intentionally maintained as an external plugin. The goal is to close a few generic host-side gaps so external plugins that already implement richer metadata, execution, triggers, batch, and BLOB behavior can expose those capabilities through the Tabularis UI.

Would this sequencing be acceptable? If preferred, we can start with the contract/docs alignment PR first and keep the runtime forwarding changes separate.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions