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#
| Symbol | Meaning |
|---|---|
yes | Supported and successfully tested |
? | Implemented in general, needs better testing for this specific database |
WIP | Work in progress, not yet supported |
-- | Not implemented yet |
N/A | Not 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.
| Feature | DB2 LUW | DB2 z/OS | DB2 i | Informix | MSSQL | MySQL | MariaDB | Oracle | PostgreSQL | SQL Any. | SQLite | Sybase |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pre-migration analysis | WIP | –[9] | –[9] | yes | WIP | WIP | WIP | WIP | WIP | WIP | yes | WIP |
| Migration of data | yes | yes[9] | yes[9] | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| NOT NULL constraints | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| Default values on columns | yes | yes | yes | WIP | yes | yes | yes | yes | yes | yes | yes | yes[4] |
| IDENTITY columns | yes | yes | yes | yes | yes | yes | yes | yes[1] | yes | yes | yes[8] | yes |
| Computed (generated) columns | – | – | – | – | – | yes | yes | yes | yes | – | yes[8] | yes[5] |
| Custom data type replacements | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| Implicit default replacements[6] | yes | yes | yes | – | yes | yes | yes | yes | N/A | yes | yes | yes |
| Custom default value replacements | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| Primary keys | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| Secondary indexes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes[8] | yes |
| Foreign keys | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| FK on delete action | – | yes | yes | – | – | – | – | yes | yes | – | yes | N/A* |
| Check constraints | yes | yes | yes | yes | – | – | – | ?[7] | yes | – | yes[8] | yes |
| Check rules / domains[3] | – | – | – | – | – | N/A | N/A | ?[7] | ? | – | N/A | yes |
| User-defined types | – | – | – | – | ? | N/A | N/A | ?[7] | yes | – | N/A | yes |
| User-defined collations[12] | – | – | – | – | – | – | – | – | yes | – | N/A | – |
| Full text search objects[13] | – | – | – | – | – | – | – | – | yes | – | N/A | – |
| User-defined aggregates[14] | – | – | – | – | – | N/A | N/A | – | yes | – | N/A | – |
| Comments on columns | yes | –[9] | –[9] | N/A* | – | yes | yes | ?[7] | yes | – | N/A | N/A* |
| Comments on tables | yes | –[9] | –[9] | N/A* | – | yes | yes | ?[7] | yes | – | N/A | N/A* |
| Migration of views | ? | ? | ? | WIP | ? | WIP | WIP | ?[7] | yes | WIP | ?[8] | ? |
| Conversion of functions / procedures | – | ? | – | yes | ? | – | – | ?[7] | yes | – | N/A | ? |
| Conversion of triggers | ? | ? | ? | yes | ? | – | – | ?[7] | yes | – | ?[8] | ? |
| Sequences[2] | ? | ? | ? | – | ? | N/A | ?[10] | ?[7] | yes | – | N/A | N/A* |
| Aliases / synonyms | ? | ? | ? | ? | ? | N/A | N/A | ? | N/A | – | N/A | N/A |
| SQL function mapping[11] | WIP | WIP | WIP | WIP | WIP | WIP | WIP | WIP | N/A | WIP | WIP | WIP |
| Validation — row counts & checksums | yes | yes | –[9] | yes | yes | yes | yes | yes | yes | yes | yes | yes |
| Validation — random sample & LOB sizes | – | – | – | – | – | – | – | yes | yes | – | yes | – |
Notes#
- IDENTITY columns (Oracle). Recognised via the sequence used as the default value. Data
types remain an issue: Oracle allows a primary key on
NUMBERwith a sequence, while a PostgreSQL identity column must beINTorBIGINT. - 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). - 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.
- Sybase ASE defaults.
CREATE DEFAULTcreates 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. - 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. - Implicit default replacements. Common default values whose syntax PostgreSQL does not accept are replaced implicitly during migration.
- 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 plusCREATE TRIGGER, and complex constructs are flagged for manual review. Object types become composite types; collection types (VARRAY, nested tables) become array-based domains. - SQLite. SQLite has no data dictionary for several of these objects, so check
constraints, generated column expressions,
AUTOINCREMENTmarkers and functional index expressions are parsed out of theCREATEstatements insqlite_master. Views, triggers and expressions are translated withsqlglotplus a SQLite-specific function mapping. Partial indexes lose theirWHEREcondition (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. - 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 ONstatements are parsed out of the DDL and stored in the protocol tables, but are not yet applied to the target. - MySQL and MariaDB. Separate, largely identical connectors. MariaDB additionally migrates
standalone
SEQUENCEobjects (MariaDB 10.3+). Neither converts functions, procedures or triggers. - 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.
- User-defined collations. Standalone
CREATE COLLATIONobjects 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. - Full text search objects. Dictionaries and
text search configurations
referenced by generated
tsvectorcolumns, views, indexes and functions. Migrated for a PostgreSQL source including the complete token type mapping; references inside'name'::regconfigliterals are rewritten. Objects belonging to an extension are not migrated — they come with the extension. - User-defined aggregates.
CREATE AGGREGATEobjects, 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 database | Tested version |
|---|---|
| IBM DB2 LUW | latest |
| IBM DB2 z/OS | DDL + CSV extracts (offline, no live instance) |
| IBM DB2 for i | DDL + CSV extracts (offline, no live instance) |
| Informix | 14.10 |
| MS SQL Server | 2022 |
| MySQL | 5.7 |
| MariaDB | not yet validated against a live instance |
| Oracle | 21.3 |
| PostgreSQL | 14, 17 |
| SQL Anywhere | 17 |
| SQLite | 3.46 |
| Sybase ASE | 16.0 |
Missing a source database or a feature you need? Support can be added on demand — see Get Involved.
