Skip to main content

Feature Matrix

Table of Contents

How complete a migration is depends heavily on the source database. The table below shows the per-connector, per-feature status. It mirrors FEATURE_MATRIX.md in the repository, which is the authoritative version and is reconciled against the connector sources — every entry corresponds to code that is actually present, not to a plan.

Legend
#

SymbolMeaning
yesSupported and successfully tested
?Implemented in general, needs better testing for this specific database
WIPWork in progress, not yet supported
--Not implemented yet
N/ANot supported by this source database (* = needs deeper verification)

The hardest part of raising a ? to a yes is usually finding a test database that actually uses the feature in a realistic way.

Support by connector
#

Column abbreviations: DB2 LUW / z/OS / i = IBM DB2 variants, MSSQL = MS SQL Server, SQL Any. = SQL Anywhere, Sybase = Sybase ASE.

FeatureDB2 LUWDB2 z/OSDB2 iInformixMSSQLMySQLMariaDBOraclePostgreSQLSQL Any.SQLiteSybase
Pre-migration analysisWIP–[9]–[9]yesWIPWIPWIPWIPWIPWIPyesWIP
Migration of datayesyes[9]yes[9]yesyesyesyesyesyesyesyesyes
NOT NULL constraintsyesyesyesyesyesyesyesyesyesyesyesyes
Default values on columnsyesyesyesWIPyesyesyesyesyesyesyesyes[4]
IDENTITY columnsyesyesyesyesyesyesyesyes[1]yesyesyes[8]yes
Computed (generated) columnsyesyesyesyesyes[8]yes[5]
Custom data type replacementsyesyesyesyesyesyesyesyesyesyesyesyes
Implicit default replacements[6]yesyesyesyesyesyesyesN/Ayesyesyes
Custom default value replacementsyesyesyesyesyesyesyesyesyesyesyesyes
Primary keysyesyesyesyesyesyesyesyesyesyesyesyes
Secondary indexesyesyesyesyesyesyesyesyesyesyesyes[8]yes
Foreign keysyesyesyesyesyesyesyesyesyesyesyesyes
FK on delete actionyesyesyesyesyesN/A*
Check constraintsyesyesyesyes?[7]yesyes[8]yes
Check rules / domains[3]N/AN/A?[7]?N/Ayes
User-defined types?N/AN/A?[7]yesN/Ayes
User-defined collations[12]yesN/A
Full text search objects[13]yesN/A
User-defined aggregates[14]N/AN/AyesN/A
Comments on columnsyes–[9]–[9]N/A*yesyes?[7]yesN/AN/A*
Comments on tablesyes–[9]–[9]N/A*yesyes?[7]yesN/AN/A*
Migration of views???WIP?WIPWIP?[7]yesWIP?[8]?
Conversion of functions / procedures?yes??[7]yesN/A?
Conversion of triggers???yes??[7]yes?[8]?
Sequences[2]????N/A?[10]?[7]yesN/AN/A*
Aliases / synonyms?????N/AN/A?N/AN/AN/A
SQL function mapping[11]WIPWIPWIPWIPWIPWIPWIPWIPN/AWIPWIPWIP
Validation — row counts & checksumsyesyes–[9]yesyesyesyesyesyesyesyesyes
Validation — random sample & LOB sizesyesyesyes

Notes
#

  1. IDENTITY columns (Oracle). Recognised via the sequence used as the default value. Data types remain an issue: Oracle allows a primary key on NUMBER with a sequence, while a PostgreSQL identity column must be INT or BIGINT.
  2. Sequences. Not migrated as standalone objects for most engines. SERIAL/BIGSERIAL, identity columns and columns with a sequence default become PostgreSQL identity columns, so the sequence is created automatically and its current value is set from the migrated data afterwards. Oracle additionally migrates standalone sequences as independent PostgreSQL sequences (see note 7).
  3. Check rules / domains. Externally defined checks bound to a column or data type — domains in PostgreSQL, rules in some other engines. Currently being implemented for Sybase ASE.
  4. Sybase ASE defaults. CREATE DEFAULT creates a named default that can be attached to several columns. PostgreSQL has no equivalent, so the underlying default value is attached directly to each target column.
  5. Sybase ASE computed columns. Sybase creates hidden computed columns for function-based indexes (e.g. sybfi4_1 AS LOWER(ProductName) MATERIALIZED), which also changes the index DDL stored in the system tables.
  6. Implicit default replacements. Common default values whose syntax PostgreSQL does not accept are replaced implicitly during migration.
  7. Oracle. Check constraints, standalone sequences, user-defined types, domains, table/column comments, views/materialized views and best-effort PL/SQL conversion are implemented but not yet validated against a live database. PL/SQL conversion is heuristic: packages are split into standalone <package>_<routine> functions with call sites rewritten (package state is not migrated), triggers become a PL/pgSQL trigger function plus CREATE TRIGGER, and complex constructs are flagged for manual review. Object types become composite types; collection types (VARRAY, nested tables) become array-based domains.
  8. SQLite. SQLite has no data dictionary for several of these objects, so check constraints, generated column expressions, AUTOINCREMENT markers and functional index expressions are parsed out of the CREATE statements in sqlite_master. Views, triggers and expressions are translated with sqlglot plus a SQLite-specific function mapping. Partial indexes lose their WHERE condition (recorded in the index comment) and a partial unique index is degraded to a non-unique index. Virtual tables (FTS, RTREE, …) and their shadow tables are skipped. Because SQLite is dynamically typed, values are coerced to the target column type during data migration.
  9. IBM DB2 z/OS and DB2 for i. These are offline connectors — they never connect to the source instance. Structure is read from .sql/DDL extracts (connectivity: "ddl") and data from source-generated CSV files. Anything requiring a live source (pre-migration analysis, random-sample and LOB-size validation) is therefore unavailable. COMMENT ON / LABEL ON statements are parsed out of the DDL and stored in the protocol tables, but are not yet applied to the target.
  10. MySQL and MariaDB. Separate, largely identical connectors. MariaDB additionally migrates standalone SEQUENCE objects (MariaDB 10.3+). Neither converts functions, procedures or triggers.
  11. SQL function mapping. Every connector ships a mapping of common source SQL functions to PostgreSQL equivalents, applied when defaults, views, constraints and routine bodies are converted. Coverage differs per engine and is extended on demand — hence WIP everywhere. No mapping is needed for a PostgreSQL source.
  12. User-defined collations. Standalone CREATE COLLATION objects referenced by columns and indexes, migrated for a PostgreSQL source (ICU and libc provider, locale, tailoring rules, non-deterministic collations, comment). Collations of other engines (utf8mb4_general_ci, Latin1_General_CI_AS, …) have no PostgreSQL counterpart, so the reference is dropped and the column keeps the target database default.
  13. Full text search objects. Dictionaries and text search configurations referenced by generated tsvector columns, views, indexes and functions. Migrated for a PostgreSQL source including the complete token type mapping; references inside 'name'::regconfig literals are rewritten. Objects belonging to an extension are not migrated — they come with the extension.
  14. User-defined aggregates. CREATE AGGREGATE objects, migrated for a PostgreSQL source with their state transition, final, parallel and moving-aggregate support functions, initial conditions, sort operator and parallel safety. Created after the functions and procedures they reference. Aggregates provided by an extension are not migrated.

Tested database versions
#

Source databaseTested version
IBM DB2 LUWlatest
IBM DB2 z/OSDDL + CSV extracts (offline, no live instance)
IBM DB2 for iDDL + CSV extracts (offline, no live instance)
Informix14.10
MS SQL Server2022
MySQL5.7
MariaDBnot yet validated against a live instance
Oracle21.3
PostgreSQL14, 17
SQL Anywhere17
SQLite3.46
Sybase ASE16.0

Missing a source database or a feature you need? Support can be added on demand — see Get Involved.